immutable的ADT具有不少特性。
表示独立性:
client使用ADT无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端,除非ADT的操作指明了具体的前置条件和后置条件,否则不能改变ADT的内部表示。
表示泄露:
不仅影响不变性,也影响了表示独立性,无法在不影响客户端的情况下改变其内部表示。最好的办法:使用immutable的类型并且将其声明为(privat final),彻底避免表示泄露,此外还可以使用防御式拷贝。
不变量、表示不变量RI:
由ADT来负责其不变量,与client端的任何行为无关。
RI:R→boolean,某个具体的表示是否是合法的,是所有表示值的一个子集,也包含了所有合法的表示值,一个条件,描述了什么是合法的表示值:
表示空间、抽象空间AF:

ADT开发者关注表示空间R,client关注抽象空间A。
抽象函数:R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。
AF:满射,非单射,未必双射,可知R中的部分值并非合法,在A中无映射。
即使是同样的R,同样的RI,也可能有不同的AF,即解释不同。
例如:

随时检查RI是否满足:在所有可能改变rep的方法内部都要检查。
Observer方法可以不用,但建议也要,防止万一。
要精确记录RI:rep中的所有fileds何为有效。
要精确记录AF:如何解释每一个R值。
本文探讨了不可变数据结构(ADT)的特点,包括表示独立性、表示泄露问题,以及如何通过使用final和private保护内部表示并确保不变量。文章强调了抽象函数(AF)的重要性,展示了不同的解释映射可能带来的变化,并提倡在方法中检查不变量和使用观察者模式。
2250

被折叠的 条评论
为什么被折叠?



