`
zuzong
  • 浏览: 117111 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

软件设计原则——Design by Contract(契约式设计)

阅读更多
个人心得,权作讨论,切勿当真 

Design by Contract(契约式设计),以下简称DbC,字面意义来看,包含两个内容“责任”与“义务”,是对交易或互动中,两方之间关系的约束。换用软件行话来说,表示调用方与被调用方的,参数和返回值的Assert处理。

Assert有三个,前提条件、后续条件、和不变式,前两个针对方法,而最后一个针对整个类,“前提条件”指完成function需要的参数必须为真,“后续条件”指function的结果必须为真,“不变式”指class必须为真。那在代码中如何体现呢。。。

1、前提条件,谁来做“真”验证?调用方还是被调用方?有个很简单的例子,在超时买完东西付费,你总得给钱吧,所以调用方需要做非空验证。至于给多给少那是收银员需要判断的事了,所以具体的逻辑验证自然由被调用方来处理。很多新人都习惯于在action中做“前提条件”的处理,且不论后方的service方法可能变化,就action的来源来说,如果有PC浏览器请求,手机浏览器请求,手机客户端Http请求,远程调用方请求,那该如何处理,都cp一份“前提条件”处理代码吗?要是这时service方法变了。。。嘿嘿,杯具了。
当然,到了service内部,logic和operation之间就不需要验了,因为这里已经远离输入端,且有“后续条件”的保证。

2、后续条件,保证执行结果是调用方所期望的,那错误的结果如何处理呢?如果是在service内部,则抛异常就是了。而在action和service之间,比较好的做法是看这个错误能否被请求方(用户)处理,若可以(如输入错误),则返回一个错误信息,由action发下去;若不可(如sql错误、通信通道错误),则捕获这个异常,编写异常信息,再包装成运行时异常继续往上抛,交由系统的统一异常处理方法,到时处理方法可以是错误页面展现,也可以是给一个约定的格式下去

3、不变式,个人理解,就是看这个类的hashcode。

若涉及到了继承,子类和父类,则需要遵守一个原则,即子类方法的前提条件不强于基类,后续条件不弱于基类。此处实际是遵守了LSP 里氏替换原则(Liskov substitution principle)


相关书籍
《UML Distilled: A Brief Guide to the Standard Object Modeling Language (3rd Edition) 》此书有中文版
《Design by Contract by Example》(Design by Contract原则与实践)
作者列出了DbC的六条原则和六条准则:
六原则:
1、区分命令和查询
    查询返回一个结果,但不改变对象的可见性质。命令改变对象的状态,但不返回结果。

2、将基本查询同派生查询区分开
    派生查询可以用基本查询来定义。

3、针对每个派生查询,设定一个后验条件,使用一个或多个基本查询的结果来定义它
    这样一来,只要我们知道基本查询的值,也就能知道派生查询的值。

4、对于每个命令都撰写一个后验条件,以规定每个基本查询的值
    结合“用基本查询定义派生查询”的原则(原则3),我们现在已经能够知道每个命令的全部可视效果。

5、对于每个查询和命令,采用一个合适的先验条件
    先验条件限定了客户调用查询和命令的时机。

6、撰写不变式来定义对象的恒定特性
    类是某种抽象的体现,应当将注意力集中在最重要的属性上,以建立关于类抽象的正确概念模型。

六准则:
1、在适当的地方添加物理限制
    尤其是那些需要限制变量不应该为void的地方。

2、先验条件中尽可能使用高效的查询
    如果有必要,可以增加高效的派生查询,并在其后验条件中确保其与较低效的基本查询之间的等价关系。

3、用不变式限定属性
    如果一个派生查询被实现为一个属性,则应通过类中不变式的断言保证它与其他查询保持一致。在一个类的开发过程中,通常应该先把断言检测的级别设为最高级,使先验条件、后验条件和不变式都得到检测;一旦通过了检测和测试,一般就可以降低断言检测的级别,只检测先验条件,以提过代码的运行效率。

4、为了支持特性的重定义,用相应的先验条件确保每个后验条件
    这样就允许在子类开发过程中进行各种不可预见的重定义。

5、将预期发生的变化和框定规则这两种不同的限制分别放置在不同的类中
    这使开发者在扩展已有类时享有更多的自由。

6、若有保密性要求,则违背保密性的查询只能被设为私有熟悉在契约中使用
    这里的“设为私有”,是对“在契约中使用了该查询的类”之下的层次而言,至于类之上的层次,这个查询当然是可以使用的。
1
7
分享到:
评论

相关推荐

    Desing by Contract Utilities-开源

    本文将介绍一个开源项目——"Design by Contract Utilities",该项目提供了一组小而实用的工具类,用于在Java或其他支持此类契约的编程语言中实现DBC原则。这个开源库旨在简化开发者在日常开发中的契约编程实践,...

    31天重构速成

    通过在代码中引入契约式设计(Design By Contract),可以在方法的入口和出口处进行预置条件和后置条件检查,提高代码的健壮性和安全性。 #### 24. Remove Double Negative 消除代码中的双重否定,可以使逻辑表达...

    重构速成---一份讲解重构和设计模式的好资料,推荐

    25. **引入契约设计检查(Introduce Design By Contract checks)** - **定义**: 在代码中加入预条件、后条件等契约式编程元素。 - **目的**: 增强代码的鲁棒性。 - **应用场景**: 当需要确保方法的正确调用时。...

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    并联型APF有源电力滤波器Matlab Simulink仿真:dq与αβ坐标系下的谐波无功检测与PI控制及SVPWM调制

    内容概要:本文详细介绍了并联型有源电力滤波器(APF)在Matlab/Simulink环境下的仿真研究。主要内容涵盖三个关键技术点:一是dq与αβ坐标系下的谐波和无功检测,利用dq变换和FBD技术实现实时检测;二是两相旋转坐标系(dq)与两相静止坐标系(αβ)下的PI控制,通过调整比例和积分环节实现精准控制;三是SVPWM调制方式的应用,通过优化开关时序提升系统效率和性能。文中还提供了详细的仿真介绍文档,包括模型搭建、参数设定以及结果分析。 适合人群:从事电力电子、自动化控制领域的研究人员和技术人员,尤其是对电力滤波器仿真感兴趣的读者。 使用场景及目标:适用于需要深入了解并联型APF工作原理和实现方式的研究人员,旨在通过仿真工具掌握谐波和无功检测、PI控制及SVPWM调制的具体应用。 其他说明:本文不仅提供了理论知识,还结合了实际操作步骤,使读者能够通过仿真模型加深对APF的理解。

    Arduino KEY实验例程【正点原子ESP32S3】

    Arduino KEY实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    .archivetempdebug.zip

    .archivetempdebug.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    两极式单相光伏并网系统的Boost电路与桥式逆变仿真及优化方法

    内容概要:本文详细介绍了两极式单相光伏并网系统的组成及其仿真优化方法。前级采用Boost电路结合扰动观察法(P&O)进行最大功率点跟踪(MPPT),将光伏板输出电压提升至并网所需水平;后级利用全桥逆变加L型滤波以及电压外环电流内环控制,确保并网电流与电网电压同频同相,实现高效稳定的并网传输。文中还提供了具体的仿真技巧,如开关频率设置、L滤波参数计算和并网瞬间软启动等,最终实现了98.2%的系统效率和低于0.39%的总谐波失真率(THD)。 适合人群:从事光伏并网系统研究、设计和开发的技术人员,特别是对Boost电路、MPPT算法、逆变技术和双环控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解两极式单相光伏并网系统的工作原理和技术细节的研究人员和工程师。目标是在实际项目中应用这些理论和技术,提高光伏并网系统的效率和稳定性。 其他说明:文中提供的仿真技巧和伪代码有助于读者更好地理解和实现相关算法,在实践中不断优化系统性能。同时,注意电网电压跌落时快速切换到孤岛模式的需求,确保系统的安全性和可靠性。

    昭通乡镇边界,矢量边界,shp格式

    矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    岩土工程中随机裂隙网络注浆模型及其应用:不同压力下注浆效果的研究

    内容概要:本文详细介绍了三种注浆模型——随机裂隙网络注浆模型、基于两相达西定律的注浆模型、基于层流和水平集的注浆扩散模型。首先,随机裂隙网络注浆模型基于地质学原理,模拟裂隙网络发育的实际地质情况,在不同注浆压力下进行注浆作业,以增强地基稳定性和提高承载能力。其次,基于两相达西定律的注浆模型利用数学公式模拟裂隙网络中的流体输送过程,适用于裂隙网络地质条件下的注浆效果分析。最后,基于层流和水平集的注浆扩散模型通过引入层流特性和水平集方法,更准确地模拟注浆过程中的扩散过程。文中还讨论了不同注浆压力对注浆效果的影响,并提出了优化建议。 适合人群:从事岩土工程、地基加固等相关领域的工程师和技术人员。 使用场景及目标:①帮助工程师选择合适的注浆模型和注浆压力;②为实际工程项目提供理论支持和技术指导;③提升地基加固的效果和效率。 其他说明:文章强调了在实际应用中需要结合地质条件、裂隙网络特点等因素进行综合分析,以达到最佳注浆效果。同时,鼓励不断创新注浆工艺和方法,以满足日益增长的地基加固需求。

    COMSOL Multiphysics 5.5与6.0版本Ar棒板粗通道流注放电仿真的电子特性分析

    内容概要:本文详细比较了COMSOL Multiphysics软件5.5和6.0版本在模拟Ar棒板粗通道流注放电现象方面的异同。重点探讨了不同版本在处理电子密度、电子温度、电场强度以及三维视图等方面的优缺点。文中不仅介绍了各版本特有的操作方式和技术特点,还提供了具体的代码实例来展示如何进行精确的仿真设置。此外,文章还讨论了网格划分、三维数据提取和电场强度后处理等方面的技术难点及其解决方案。 适合人群:从事等离子体物理研究的专业人士,尤其是熟悉COMSOL Multiphysics软件并希望深入了解其最新特性的研究人员。 使用场景及目标:帮助用户选择合适的COMSOL版本进行高效、精确的等离子体仿真研究,特别是在处理复杂的Ar棒板粗通道流注放电现象时提供指导。 其他说明:文章强调了在实际应用中,选择COMSOL版本不仅要考虑便捷性和视觉效果,还需兼顾仿真精度和可控性。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

Global site tag (gtag.js) - Google Analytics