契约式设计(DbC)感想(一)
契约式设计可以理解为正则编程的一种实践:
如果用我的三脚猫能力将这种实践方法形式化的话,大致如下(如有不正确处,请不吝指正):
1、对于方法Method的precondition & postcondition:
Function(RegularMthod) =
^ RegularFunction
^ General-Class-Method
^ Assert(precondition)
^ Assert(postcondition);
=> f1( f2 ) { f1, f2 : RegularMethod }
|-> Assert(f2.precondition) => Assert( f1.postcondition )
当所有方法都满足上述条件的时候,那就意味着该程序的输入如果满足assert(precondition),那么它的输出也满足assert(postcondition),从而在逻辑上保证程序的正确性。这是针对方法调用或者函数调用上讲的,这个倒是可以在有函数或者过程的语言里面都可以实现。我个人理解为operation组合上的正则性(regularity)。
2、类Class的不变式Invariant:
Class(InvariantClass) =
^ General-Class
^ Invariant : assert(invariant) when any method called.
一个类的所有直接或者间接的子类都要满足它的不变式Invariant,从而保证该类及其衍生类在数据上保证正确性,个人理解为data组合的正则性。
综合上述两点,在operation 以及 data的组合上均实现了正则性,即面向对象上的正则性,从而在理论上保证了对象的正则性以及以对象构造出来的程序的正确。
3、适当的DbC
过犹不及。如果我们将每一个类都很详细地进行DbC,那也是一件很耗时、痛苦的没有必要的事情,正如你预防着小偷固然好,但是将除了自己之外的其他人都像防贼一样来防着也不合适一样。我们应该是适当地DbC。
DbC更是一种思想,一种思维模式,为如何构造出高质量的软件指出一个道道来,它告诉我们,依如是法,达高质量的彼岸。如果在实践中运用则应当根据具体情况而定。
契约式设计(DbC)感想(一)的更多相关文章
- 契约式设计(DbC)感想(二)
契约式设计6大原则的理解 在<Design by Contract原则与实践>中,作者定义了契约式设计的6大原则: 区分命令和查询: 将基本查询和派生查询区分开: 针对每个派生查询,设定一 ...
- 重构25-Introduce Design By Contract checks(契约式设计)
契约式设计(DBC,Design By Contract)定义了方法应该包含输入和输出验证.因此,可以确保所有的工作都是基于可用的数据,并且所有的行为都是可预料的.否则,将返回异常或错误并在方法中进行 ...
- JML契约式设计——第三单元学习小结
一.前言 本单元作业都是关于JML(Java Modeling Language),JML是一种契约式设计(Design by Contract)的语言,契约式设计的主要目的是希望程序员能够在设计程序 ...
- 契约式设计 契约式编程 Design by contract
Design by contract - Wikipedia https://en.wikipedia.org/wiki/Design_by_contract What is the use of & ...
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...
- groovy动态类型--能力式设计
动态类型 动态类型中的类型是在运行时推断的,方法及其参数也是在运行时检查的. 能力式设计 被称作鸭子模式:他有这么一个观点:如果它走路像鸭子,叫起来也像鸭子,那么他就是一只鸭子. 契约式设计 相当于J ...
- Windows 10 响应式设计和设备友好的开发
使用Effective pixels有效像素设计UI 什么是缩放像素和Effective有效像素: 当你的应用程序运行在Windows的设备,系统用一个算法控制的规范,字体,和其他UI元素显示在屏幕上 ...
- 第三单元总结——JML契约式编程
OO第三单元博客作业--JML与契约式编程 OO第三单元的三次作业都是在课程组的JML规格下完成.完成作业的过程是契约式编程的过程:设计者完成规格设计,实现者按照规格具体实现.作业正确性的检查同样围绕 ...
- ASP.NET Web API标准的“管道式”设计
ASP.NET Web API的核心框架是一个消息处理管道,这个管道是一组HttpMessageHandler的有序组合.这是一个双工管道,请求消息从一端流入并依次经过所有HttpMessageHan ...
随机推荐
- Vue实例及生命周期
1,Vue实例生命周期. 有时候,我们需要在实例创建过程中进行一些初始化的工作,以帮助我们完成项目中更复杂更丰富的需求,开发,针对这样的需求,Vue提供给我们一系列的钩子函数 2,Vue生命周期的阶段 ...
- rm -rf / – Deletes Everything!
https://www.howtogeek.com/125157/8-deadly-commands-you-should-never-run-on-linux/
- accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePressEvent的实现,最为典型。如果希望忽略事件,只要调用父类的响应函数即可)
QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子. 推荐直接调用QWidget的事件处理函数.而不是调用 ...
- 异步编程错误处理 ERROR HANDLING
Chapter 16, "Errors and Exceptions," provides detailed coverage of errors and exception ha ...
- jfreechart应用2--柱状图(作者:百度 被风吹过的日子)
jfreechart应用2--柱状图 二. 柱状图 在WebRoot目录下建立bar目录,用来存放柱状图的各个例子.首先在该目录下建立一个sample1.jsp文件,让我们来看一个简单的柱状图的例 ...
- 实现的是Linux和Windows之间的一种共享--samba
samba 基本配置及自定义控制 https://www.cnblogs.com/l-hh/p/9473937.html Samba简介: Samba实现的是Linux和Windows之间的一种共享, ...
- [转]python的startswith()方法
描述 Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则在指定范围内检查. 语法 ...
- 3.jeesite主从表开发
1. 2 3. 4. 5. 6. 7. 8. 9. 10.
- bzoj 3470: Freda’s Walk【拓扑排序+期望dp】
dfs会T,只好正反两遍拓扑了-- #include<iostream> #include<cstdio> #include<queue> #include< ...
- 最小割树Gomory–Hu tree
fanhq666地址:http://fanhq666.blog.163.com/blog/static/8194342620113495335724/ wiki地址(证明):https://en.wi ...