3.7 规格说明、前置/后置条件
- 规格说明是实现者和使用者之间的契约。方便开发者规范开发,使用者阅读、使用方便,使开发者和使用者可以通过此规范达到互不干扰的目的。需要包括方法名称、功能、参数和返回值。
- 组成:
前置条件与后置条件 - 前置条件(要求),关键词:require
表示要调用该方法的状态,用来约束调用者 - 后置条件(承诺),关键词:effects
表示前置条件满足后该方法必须遵循的规则。如果前置条件满足,后置必须满足,前置不满足,后置也就无所谓。
- 除了前置后置条件的声明,其他的规格说明写在注释里。
@param:对参数的说明,尽可能将前置条件放入此处。
@return:描述结果,尽量将后置条件放到这里。
@throws:记录每个异常
- Javadoc规格说明书写格式化规范
- 可变的方法对于规格说明的要求更加严格,但也依赖于规格说明,如果没有按照规格说明执行,则可能会发生错误,而不可变的方法直接严格阻绝错误发生。
- 可以利用黑盒测试来测试代码是否符合规格说明。
3.8 行为等价性
确定行为的等价, 关键是一个规格说明实现是否可以替换另一个。
3.9 规约的强度
- 强度定义:
(1)确定的:只有一个返回值和一个最终状态。
(2)低确定的:允许同一输入多个有效输出。
(3)非确定的:输出结果不确定。
前置条件越弱,后置条件越强,则该规格说明越强。(要求少,承诺多)
- 图表规格说明:一个区域一个规格,包含的点是其实现。规格越强,区域越小(实现变少了)。
3.10 ADT操作的四种类型
- Creators:产生类型的新对象。
可以实现构造函数(工厂方法),也可以是一个静态方法。 - Producers:在已有的对象基础上产生新对象。
- Observers:输入抽象类型的对象,返回其他类型的对象。
- Mutators:改变对象。通常为void,有时是Boolean。
比如list.add。
3.11 表示独立性
抽象数据类型的使用独立于其表示。用户在使用时不用管内部如何实现,内部实现变化也不影响调用,除非契约改变。
3.12 表示泄露
ADT的可见、可被客户端修改。
3.13 不变量、表示不变量
- 不变量:程序的属性,每个抽象数据类型都应保有自己的不变量,这些不变量被构造函数创建后保持不变,其正确性不依赖于其他模块,由公共方法调用维护,方法执行期间可能暂时失效。
- 表示不变量RI:将表示值映射到布尔值。告诉我们们空间R中的r是否被AF映射到了空间A中的某个值 。
3.14 表示空间、抽象空间、AF
- 表示空间R:实现时用到的值空间。
- 抽象空间A:客户端可以看到的和使用的集合。
- AF抽象函数:将rep值映射到它们所代表的抽象值,表示R到A 的映射。AF为满射,未必是单射,未必时双射。
3.15 以注释的形式撰写AF、RI
例:对于相同的表示空间可以用不同的RI和AF表示。