契约式设计(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 ...
随机推荐
- 64位windows上访问64位oracle 12c
64位windows上访问64位oracle 12c,这会有啥问题? 没啥问题.问题是,我64位操作系统的机器上装了个oracle 10g.而oracle 10g好像是不区分啥32位.64位的,一律3 ...
- Hibernate 之 HQL
通过对Hibernate框架的学习,已经慢慢的对Hibernate有了进一步的了解,接下来我们要说的是HibernateQusery Language(HQL),如果你正在学习SSH框架,那SQL对你 ...
- asp.net 实现搜索站内搜索功能
首先有index和search 两个页面 index页面中有textbox1和button1两个控件 双击button1控件添加代码: protected void Button1_Click(obj ...
- Using Python with TurboGears A complete web framework integrating several Python projects
Using Python with TurboGears TurboGears is a Python web framework based on the ObjectDispatch paradi ...
- camera shading比例
-- ---- vendor/mediatek/proprietary/custom/mt6735/hal/D2/camera_3a/isp_tuning_custom.cpp static MINT ...
- POJ2912 Rochambeau —— 种类并查集 + 枚举
题目链接:http://poj.org/problem?id=2912 Rochambeau Time Limit: 5000MS Memory Limit: 65536K Total Submi ...
- 并不对劲的DFT
FFT是一个很多人选择背诵全文的算法. #include<algorithm> #include<cmath> #include<complex> #include ...
- Windows代码heap内存分析实战
知识这东西有时候很奇怪,每次当你重新审视他的时候可能都会有新的收获.最近为了研究一个内存相关的问题,把windows heap相关的内容又复习了一遍,收获不小,记录一下,希望有朋友使用的时候少走些弯路 ...
- Git 仓库结构 (一)***
Git 仓库 1.1Git 基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Gi ...
- 待研究———node中使用session时的id不断更改问题
使用的expree,中间件为cookie-parser,express-session,当对res.session.id进行赋值操作后,再调取其值会发现,此时它的值并不是最初给定的值,而是经过加密的字 ...