用例规约(Specification)是开发者和客户端的一种协议,由前置条件(pre-condition)和后置条件(post-condition)组成,前置条件则为客户端需要遵守的规范,若前置条件满足,则开发者必须满足后置条件。良好的规约可以使客户端清晰明了地使用,也方便开发者的实现。
当一个规约的前置条件更弱或后置条件更强时,我们称它是更强的,更强的规约可以替换其他规约,意味着对开发者的自由度和任务更重,而客户端的任务更轻。
规约有助于保护程序安全,便于理解,客户端不需要看到内部如何实现,通过规约就能使用。
AF和RI,全称Rep Invariant和Abstraction Function,译为表示不变量和抽象函数。
由于我们不能将程序内部直接暴露给客户端,所以在客户端生成一个抽象空间(不是实际存在的),在这个空间内是客户端需要的内容。
而抽象函数就是从程序内部的实例空间到抽象空间的映射。而表示不变性就相当于自变量定义域:
指一个类的实例在任何时候都满足一定的条件,保证数据的合法性和一致性。必须符合RI的规定,若运行程序时,出现某个实例不满足RI则说明设计失败,需要重新设计。
// AF(c) = 一个有限集合 {c.elements[i] | 0 <= i < c.size}
// RI: c.elements != null && 0 <= c.size <= c.elements.length
// safety from rep exposure:
// 所有域都是私有的
// 没有返回引用可变对象
public class Set {
private Object[] elements;
private int size;
public Set() {
elements = new Object[10];
size = 0;
}
// 其他方法省略
}