复习:
1.rep exposion:ADT中的重要指标是是否存在rep泄露。最好的办法就是 使用immutable的类型,彻底避免表示泄露。
基本的rep泄露有以下几种:
1).变量没有使用private保护,导致其他类中可以随意查看甚至更改该变量。
2).没有使用正确的obsever而返回了mutable,导致改变了值从而泄露rep。
3).和2类型相似,都是没有做好防御式拷贝,导致其他类的修改直接作用于mutable变量。
前一种比较明显,后两种有时不易察觉。用户向构造器中传递了一个可变数据类型,而构造方法直接将这个变量赋值给自己的成员属性,虽然我们没有直接将rep给用户,但用户可以引用这个变量。
immutable类可以拥有mutable的子类,只要子类还能替代父类且mutable的部分不影响本身的immutable的性质即可,并不违反LSP原则。
2.
spec的强弱的判断和比较方法
前置条件越弱,一方面,对于用户更加的友好,其不用考虑太多的情况即可放心使用。另一方面,对于程序员的要求就越高,因为这意味着他需要考虑到更多的情况,使得程序员不能随便实现了。使得规约变强。
后置条件越强,对于用户来讲得到的信息越具体,这样就需要程序员使用更加具体的实现方式,限制了实现的手段,使得程序员不能随便实现了。使得规约变强。
因为前置条件必须被满足,所以后置条件的比较是在前置假设成立的条件下进行的,在很多情况下,前置条件的限制使得后置条件从不同变为相同
规约越强,实现的手段就越少。所以我们在实现了一个规约之后,代码可以直接适用于比这个规约弱的规约,但是不再能适用于比这个强的规约了。