首页 C++箴言:使接口易于正确使用难错误使用

C++箴言:使接口易于正确使用难错误使用

举报
开通vip

C++箴言:使接口易于正确使用难错误使用C++箴言:使接口易于正确使用难错误使用C++被淹没于接口中。函数接口、类接口、模板接口。每—个接口都意味着客户的代码和你的代码互相影响。假设你在和通情达理的人打交道,那些客户也想做好工作。他们想要正确使用你的接□o在这种情况下,如果他们犯了一个错误,就说明你的接口至少有部分是不完善的。在理想情况下,如果一个接口的一种尝试的用法不符合客户的预期,代码将无法编译,反过来,如果代码可以编译,那么它做的就是客户想要的。开发易于正确使用,而难以错误使用的接口需要你考虑客户可能造成的各种错误。例如,假设你正在设计一个代表时间...

C++箴言:使接口易于正确使用难错误使用
C++箴言:使接口易于正确使用难错误使用C++被淹没于接口中。函数接口、类接口、 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 接口。每—个接口都意味着客户的代码和你的代码互相影响。假设你在和通情达理的人打交道,那些客户也想做好工作。他们想要正确使用你的接□o在这种情况下,如果他们犯了一个错误,就 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 你的接口至少有部分是不完善的。在理想情况下,如果一个接口的一种尝试的用法不符合客户的预期,代码将无法编译,反过来,如果代码可以编译,那么它做的就是客户想要的。开发易于正确使用,而难以错误使用的接口需要你考虑客户可能造成的各种错误。例如,假设你正在设计一个代表时间的类的构造函数:classDate{public:Date(intmonth,intday,intyear);•••};匆匆一看,这个接口似乎是合乎情理的(至少在美国),但是客户可能很容易地造成两种错误。首先,他们可能会以错误的顺序传递参数:Dated(30#3,1995);//Oops!Shouldbe830n,not"30,3n#第二,他们可能传递一个非法的代表月或日的数字:Dated(2,20,1995);//Oops!Shouldbe”3,30",not"2,20n(后面这个例子看上去好像没什么,但是想想键盘上,2就在3的旁边,这种noffbyone"类型的错误并不罕见。)很多客户错误都可以通过引入新的类型来预防。确实,类型系统是你阻止那些不合适的代码通过编译的主要支持者。在当前情况下,我们可以引入简单的包装类型来区别日,月和年,并将这些类型用于Data的构造函数。structDay{structMonth{structYear{explicitDay(intd)explicitMonth(intm)explicitYear(inty):val(d){}:val(m){}:val(y){}intval;intval;intval;};};};classDate{public:Date(constMonth&mzconstDay&d,constYear&y);};Dated(30,3,1995);//error!wrongtypesDated(Day(30)zMonth(3),Year(1995));//error!wrongtypesDated(Month(3)rDay(30)zYear(1995));//okay,typesarecorrect将日,月和年做成封装数据的羽翼丰满的类比上面的简单地使用struct更好,但是即使是struct也足够证明明智地引入新类型在阻止接口的错误使用方面能工作得非常出色。只要放置了正确的类型,它往往能合理地限制那些类型的值。例如,月仅有12个合法值,所以Month类型应该反映这一点。做到这一点的一种方法是用一个枚举来表现月,但是枚举不像我们希望的那样是类型安全(type-safe)的。例如,枚举能被作为整数使用。一个安全的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 是预先确定合法的Month的集合:classMonth{public:staticMonthJan(){returnMonth(l);}//functionsreturningallvalidstaticMonthFeb(){returnMonth(2);}//Monthvalues;seebelowfor・・・//whythesearefunctions,notstaticMonthDec(){returnMonth(12);}//objects・・・//othermemberfunctionsprivate:explicitMonth(intm);//preventcreationofnew//Monthvalues・・・//month-specificdata};Dated(Month::Mar(),Day(3O)zYear(1995));如果用函数代替对象来表现月的主意让你感到惊奇,那可能是因为你忘了非局部静态对象(non-localstaticobjects)的初始化的可靠性是值得怀疑的。Item4能唤起你的记忆。防止可能的客户错误的另一个方法是限制对一个类型能够做的事情。施加限制的一个普通方法就是加上const。例如,Item3解释了使operator*的返回类型具有const资格是如何能够防止客户对用户自定义类型犯下这样的错误:if(a*b=c)・・・//oops,meanttodoacomparison!实际上,这仅仅是另一条使类型易于正确使用而难以错误使用的普遍方针的一种表现:除非你有很棒的理由,否则就让你的类型的行为与内建类型保持一致。客户已经知道像int这样的类型如何表现,所以你应该努力使你的类型的表现无论何时都同样合理。例如,如果a和b是int,给a*b赋值是非法的。所以除非有一个非常棒理由脱离这种表现,否则,对你的类型来说这样做也应该是非法的。避免和内建类型毫无理由的不相容的真正原因是为了提供行为一致的接口。很少有特性比一致性更易于引出易于使用的接口,也很少有特性比不一致性更易于引出令人郁闷的接口。STL容器的接口在很大程度上(虽然并不完美)是一致的,而且这使得它们相当易于使用。例如,每一种STL容器都有一个名为size的成员函数可以知道容器中有多少对象。与此对比的是Java,在那里你对数组使用length属性,对String使用length方法,而对List却要使用size方法,在.net中,Array有一个名为Length的属性,而ArrayList却有一个名为Count的属性。一些开发人员认为集成开发环境(IDEs)能补偿这些琐细的矛盾,但他们错了。矛盾在开发者工作中强加的精神折磨是任何IDE都无法完全消除的。
本文档为【C++箴言:使接口易于正确使用难错误使用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
xiaobingbing
暂无简介~
格式:doc
大小:12KB
软件:Word
页数:5
分类:建筑/施工
上传时间:2022-09-14
浏览量:0