软件构造期末小贴士
软件构造期末考试在即,这里对于一些细节点做出整理,供复习参考。
1.什么是行为等价性:行为等价性是指两个对象如果在某一时刻是等价的,那么在之后的每一个操作过后都应该是等价的,往往就意味着引用自同一块内存,也就是==。例如,某一时刻Object A和Object B是等价的,那么如果有一个操作是对于A的mutator行为,那么结束之后A和B还应该是等价的。注意StringBuilder的equals实现的是行为等价性。
2.异常变少,后置条件是变强还是变弱?变强。异常是函数规约中post-condition的部分,异常变少或者更加具体一般来说是程序员对于更多的输入可能性进行了处理,所以后置条件变强了。如果异常变少的手段是将其放入pre-condition中限制用户的输入,那么本质上虽然没什么区别,但是前置条件变强,后置条件也变强,前后两者的spec无法比较。
3.委托各分类之间的区别:委托主要可以分为两类,Dependency和Association。Dependency的委托关系是临时的,而Association的委托关系是永久的,而他们呈现出来最明显的区别在于Dependency的rep中没有存放委托类型,而Association的rep中有。其中Association又根据其强弱分为Composition和Aggregation,Composition是强Association,在rep部分不仅存放了委托类型,还生成了固定的、不可修改的实例;Aggregation是弱Association,可以通过构造函数或者方法传参修改委托的实力类型。
4.常见的动态检查工具包括:Junit,EclEmma,VisualVM,AppPerfect。
5.常见的静态检查工具包括:CheckStyle,SpotBugs,PMD
6.rep exposure的检查:
(1)首先观察rep部分,所有的属性应该都被定义为private类型。
(2)观察rep部分有哪些属性是mutable的,特别注意不能对final类型变量放松警惕,因为final只是代表不能重新引用,而引用的对象的值依然是可变的。
(3)对于那些mutable的变量,去查看与他们有关的构造函数和其他方法。如果构造函数中有,那么必须进行防御性拷贝;如果他们是方法返回值,那么必须进行防御性拷贝。
7.Java目前不支持LSP中传参逆变的规则,会将其当作一种重载。
8.特别注意区分Strategy和Visitor两种设计模式,其中Strategy设计模式与委托类似,是把类的某个功能委托给其他的类或接口实现,而Visitor设计模式并不涉及类的功能实现,而只是对于类的数据进行访问和处理。在采用Visitor模式设计时,先要对于每一个访问的角色类型都实现Visitor接口,然后在被访问的类中实现Accept方法,在该方法中调用Visitor接口的visit方法。
9.防御式编程的要点在于,抛出异常来检查pre-condition,asser断言来检查post-condition。

浙公网安备 33010602011771号