这篇文章就作为本学期软构学习的最后一篇博客吧,对于一些本人认为很重要的知识点进行总结
期末复习
Immutable & mutable
immutable
- String
- 基本类型及其包装类型
- LocalDate
mutable
- List
- Set
- Map
- Date
- Arrays
- 迭代器 Iterator
判断类是immutable还是mutable可参见下文---------》怎么设计一个immutable的类
ADT设计和spec设计之间的区别
以下的例子选自我们老师提供的习题课代码
这个例子说明了spec要怎么写
最开始说明这个类要实现什么功能
@param 说明了前置条件
@return 说明了后置条件
@throws 说明了需要抛出的异常
这个例子说明了ADT要怎么写
Rep Invariants (RI) 说明了每个不变量所要满足的条件
Abstraction function(AF) 说明每个不变量所代表的含义
如何判断表示泄露(rep exposure)
主要就3点吧:
- 所有属性都是private
- 不提供mutator方法
- 返回值不能是mutable的
Snapshot图画法
可以参见这位学长的,讲解的非常详细 :
Snapshot图的最全画法、符号原理详解
我还想补充一点就是对于函数的画法:
比如对于以下代码:
/** @return the sum of the numbers in the list */
public static int sum(List<Integer> list) {
int sum = 0;
for (int x : list)
sum += x;
return sum;
}
/** @return the sum of the absolute values of the numbers in the list */
public static int sumAbsolute(List<Integer> list) {
// let's reuse sum(), because DRY, so first we take absolute values
for (int i = 0; i < list.size(); ++i)
list.set(i, Math.abs(list.get(i)));
return sum(list);
}
// meanwhile, somewhere else in the code...
public static void main(String[] args) {
// ...
List<Integer> myData = Arrays.asList(-5, -3, -2);
System.out.println(sumAbsolute(myData));
System.out.println(sum(myData));
}
Snapshot图画法:
函数用方框框起来,函数名写左边,参数写右边
Overload & Override
怎么设计一个immutable的类
- 不提供 mutators方法
- 确保不会有方法被Override
- 所有字段均为final
- 所有字段均为private
- 避免表示泄露
- 实现 toString、hashCode、clone、equals
判断前置条件和后置条件
变弱,说明表示的范围变大了
变强,说明表示的范围变小了
如果抛出了异常,说明后置条件变弱了
程序员喜欢spec弱一点(好实现)
用户喜欢spec强一点(功能全面)
hashCode 和 equals 关系
两对象equals,hashCode一定等
两对象不equals,hashCode可能等
两对象hashCode等,不一定equals
两对象hashCode不等,一定不equals
mutable类型的类不一定要重写equals和hashCode方法
类的行为等价性、观察等价性划分
注意:等价一定是建立在A空间内的
对于mutable才有行为等价性和观察等价性划分的意义
- 集合类(Collections类)、Date的
.equals()
方法提供的相等方式是:观察等价性 - StringBuilder的
.equals()
方法提供的判相等的方式是:行为等价性
关于黑盒和白盒的几组概念
- 黑盒测试 & 白盒测试
– 黑盒测试:只依据函数的spec来选择测试样例
– 白盒测试:考虑函数具体实现方法的前提下选择测试样例 - 黑盒复用 & 白盒复用
– 黑盒复用:源代码不可见,不能修改,只能通过API来使用,无法修改代码
– 白盒复用:源代码可见,可修改和扩展,复制已有代码到正在开发的系统,进行修改 - 黑盒框架 & 白盒框架
– 黑盒框架:通过实现特定接口delegation进行框架扩展
– 白盒框架:通过代码层面的继承进行框架扩展
关于静态和动态的几组概念
- 静态测试 & 动态测试
– 静态测试:靠眼睛看,不执行程序,在源代码上进行
– 动态测试:撸起袖子使劲干,通过一组给定的测试样例执行程序 - 动态类型检查 & 静态类型检查
– 动态类型检查:运行时检查
– 静态类型检查:编译时检查 - 动态类型语言 & 静态类型语言
– 动态类型语言:在编程阶段不需要明确指出变量的类型(python)
– 静态类型语言:在编程阶段需要明确指出变量的类型(java,C,C++)
委托分类
最后
这门课确实是好课,但是课程时间安排实在让人无语,希望以后可以合理安排吧
(Lab3的噩梦~)
最后老师说今年8道大题,盲猜一手🐕