7-基于契约编程-实践_第1页
7-基于契约编程-实践_第2页
7-基于契约编程-实践_第3页
7-基于契约编程-实践_第4页
7-基于契约编程-实践_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DesignbyContractPractice,郭东伟,LanguageSupportinC/C+,和其他语言相比,C/C+特别注重效率,因此不受任何程序员控制的运行期内部检查机制如:指针检查、数组下标检查、运行期类型检查等断言的使用(非关键字)assertASSERT,assert()用法,assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行一般在Debug版有效,在Release版不起作用用法:在函数开始处检验传入参数的合法性每个assert最好只检验一个条件不要使用有副作用的语句assert和后面的语句应空一行,以形成逻辑和视觉上的一致感有的地方,assert不能代替条件过滤,例子,doublesqrt(doublex)assert(x=0);/pre-condition/././.assert(fabs(y*y-x)0./Settherefreshinterval,如:,Postconditions,Postconditionsarebestimplementedasasserts,whetherornottheyarespecifiedinpublicmethods.,/ReturnsaBigIntegerofvalue(this-1modm)publicBigIntegermodInverse(BigIntegerm)if(m.signum0andprecisionRequired10e-9,ensureabs(answer*answer-x)10e-15,keywordsrequireelseareusedforpreconditions,andortheoriginalandthenewpreconditions,keywordsensurethenareusedforpostconditions,andandtheoriginalandthenewpostconditions.,Eiffel的例子,componentCUSTOMER_MANAGERcount:INTEGERid_active(an_id:CUSTOMER_ID):BOOLEANadd(a_customer:BASIC_CUSTOMER_DETAILS)requireid_not_already_activenotid_active(a_customer.id)ensurecount_increasedcount=oldcount+1customer_id_now_activeid_active(a_customer.id)name_for(an_id:CUSTOMER_ID):STRINGrequireid_active:id_active(anid)set_name(an_id:CUSTOMER_ID;a_name:STRING)requireid_active:id_active(anid)ensurename_set:name_for(an_id).is_equal(a_name)invariantcount_never_negative:count=0end,Effiel运行时检查,Stoppedinobject0 xE96978Class:CUSTOMER_MANAGERFeature:addProblem:PreconditionviolatedTag:id_not_already_activeArguments:a_customer:BASIC_CUSTOMER_DETAILS0 xE9697CCallStack:CUSTOMER_MANAGER:addWascalledbyCUSTOMER_MANAGER_UIFchange_customer,提前崩溃原则,尽早在错误点崩溃便于发现错误便于定位错误不回避错误,避免鸵鸟态度前置条件和后置条件处进行检查断言与单元测试,错误和异常,错误Error应该预料到,一般能在调用的上一级解决函数调用返回值检查系统调用状态检查异常Exception不能预料原因如无法打开必须的文件网络传输错误通常无法在本地解决,以至于不能预计会在调用层次的哪一级(直到用户交互)解决严重失效Fault不能预料出现,而且可能在任何地点出现内存溢出外部硬件错误通常无法在程序内解决,异常处理,非结构化异常处理Ifthen就地处理结构化异常处理throwtrycatch可以以类的方式定义异常的类别和层次,重新审视DbC,调用者(应用程序等)和被调用者(库函数、组件库等)是平等的,都有权利和义务的说明。检查前置条件是一种权利;而传统上模块中检查错误被认为是一种义务If(pointer=NULL)assert(pointer!=NULL)当出现错误,也就是契约(特别是前置条件)遭到破坏时,通常需要先检查调用者,重新审视DbC,明确错误和异常的关系契约遭到破坏,是一种错误满足前置条件下,无法正常得到结果,是一种异常,需要抛出设计接口必须设计契

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论