软件构造——设计规约

目录

1 方法的“行为等价性”

2 规约spec的结构

3 规约spec的形式

4 比较spec

4.1 确定性

4.2 陈述性

4.3 强度

5 spec的图形化

6 关于“是否使用precondition”的问题


1 方法的“行为等价性”

首要:站在客户端的角度。

因此无论代码内部如何相似,如何差距之大,都需要通过spec来判断“行为等价性”。

上述两个方法在开发者看来最后的结果并不一定一样。

但是在客户端看来,若结合spec:

这两个方法都符合这个规约,因此在客户端眼里,这两个方法是等价的。

2 规约spec的结构

前置条件precondition:对客户端client的约束,尽可能地在requires中体现;

后置条件postcondition:对开发者implementers的约束,尽可能地在effects中体现;

契约:若满足precondition,则必须满足postcondition。

           同样的,若不满足precondition,则方法可以做任何事。(但是开发者应该有“道德”去throw异常,以fail fast)

3 规约spec的形式

参数:@param,尽量描述precondition;

结果:@return和@throws,尽量描述postcondition。

4 比较spec

标准:确定性、陈述性、强度

4.1 确定性

确定的规约deterministic:对满足precondition的输入,只有唯一的输出。

欠定的规约underdeterministic:对满足precondition的输入,有多个输出,且通常有确定的实现。

非确定的规约nondeterministic:对同一个输入,多次执行得到的结果不同。

4.2 陈述性

操作式规约operational:给出一系列执行方法的细节,例如:伪代码。

陈述式规约declarative:无内部实现的描述,只有“初-终”状态;陈述式规约更有价值。

4.3 强度

若规约强度S2>=S1,则可以用S2替换S1。

当precondition越弱,postcondition越强,spec的强度越高。

注意:比较postcondition的强度要在相同的precondition下:

在上述例子中,后者比前者前置条件变弱,后置条件强度不变,因此后者总体强度在前者之上。

注意:存在两个方法无法比较强度。

只要是在加强spec,就可以修改规约,而不需要重新考虑其他的实现。

5 spec的图形化

每个点代表一个方法;

规约spec划定一个范围:若method满足规约,则此method代表点就落在范围内;

强spec表达为更小的区域。

6 关于“是否使用precondition”的问题

取决于check的代价和方法的使用范围。

check是指在postcondition中抛出异常,而给予client极大的自由度,即上述“体现开发者道德之处”,但是若check代价过大,则要限制client的自由。

在类内部使用的方法(private),可以不使用precondition;

在其他使用的方法(public),必须使用precondition。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91508 人正在系统学习中

来源:悬巷

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐