HIT软件构造笔记四
Abstract Data Type (ADT)
1.ADT的操作:
Creators create new objects of the type. 构造器
Producers create new objects from old objects of the type. 生产器
Observers take objects of the abstract type and return objects of a different type. 观察器
Mutators change objects. 变值器,改变对象属性的方法
2.ADT的设计法则
法则1:操作要简洁,一致。对于复杂的操作,应该拆分成多个简单操作的叠加,以此提高内聚性。
法则2:操作要全面(即需要的功能要可以实现),且为用户提供方便的操作。
法则3:要不是针对抽象,要不是针对具体,不要两者混合。因此面向具体应用的类型不应该有通用方法,面向通用的类型也不该有具体方法。
3.ADT的测试
总的来说,对构造器、生产器、变值器的测试要用观察器检查;对观察器的测试要用其他三类方法来产生或构造对象。但这样的风险是,可能会产生互相依赖的现象,导致无法找到真正的错误原因。
解决方案:新创建一些方法来解除这些耦合,或者是把一部分私有方法改为公有方法,测试完后再换回私有。或者如果对于小型程序,只要测试结果都是正确的,也就可以解决问题。
4.不变量与抽象函数
Rep Invariant(RI) and Abstraction Function(AF)
Invariants:不变量,与程序运行无关,在任何时候都应该满足的一些条件
两个空间 R 和 A:R空间是ADT的内部表示的空间,A空间是ADT能够表示的存在于实际当中的对象。ADT的开发者关注的是R空间,client关注的是A空间。
Abstraction Function:从R空间到A空间存在一个映射,这个映射是一个满射,这个映射将R中的每一个值解释为A中的一个值。这个解释函数就是AF。
Rep Invariant:这是一个集合,是R空间所有值的子集,它包含了所有合法的表示值,而只有满足RI的值,才是合法值,才会在A空间内有值与其对应。
5.AF,RI和表示泄露安全说明的文档化
这些都是写在代码的注释中,而非规约中。要给出理由,证明代码并未对外泄露其内部表示,比如字段全部为private,还有对可变字段的处理等等。
可用表示不变量来代替一些前置条件。