第一章 基础
按照阶段划分
- Build Time:构思算法、需求、设计、写代码,例如configuration,static link
- Run Time:运行时,程序被载入目标机器,开始执行,例如dynamic link
按动态性划分
- moment:时间点,例如snapshot,memory dump
- period:时间段,例如log,stack trace
按构造对象划分
- code:代码层面
- component:组件层面,如log
衡量指标
- 外部指标有:正确性(分层,防御式,形式化验证),健壮性,可扩展性,可复用性,兼容性,性能,可移至性,易用性,功能性,及时性。
- 内部指标:LOC,圈复杂度,耦合度,内聚度。
第二章 软件生命周期
瀑布过程
增量过程
- V字模型
- 原型过程
- 螺旋模型
敏捷开发
git
git仓库三部分:
- .git 本地的CMDB
- 本地文件系统
- 暂存区
pull = fetch + merge
第三章 ADT设计
静态类型检查
在编译阶段检查。
你所有能想到的Compile Error
1 | int a = "10"; |
检查”类型”的错误
动态类型检查
- divide by 0
- 数组越界
- 空指针
- …
检查”值”的错误
1 | int a = 10; |
1 | Exception in thread "main" java.lang.ArithmeticException: / by zero |
-> 动态类型错误
1 | double a = 10; |
1 | Infinity |
Mutable vs. Immutable
对象的引用
final
- final类无法派生子类
- final变量无法改变值/引用
- final方法无法被子类重写
不变对象:一旦被创建,始终指向同一个值/引用
可变对象:拥有方法可以修改自己的值/引用
Immuatable类没有mutator。
Safe:
对于mutable类进行防御性拷贝。
Specification
行为等价性:站在客户端视角看。
前置条件 requires …
设计规约
规约强弱
S2 >= S1 当S2比S1前置条件更弱(宽松),后置条件更强(严格)。
S2可以代替S1。
Trick:更强的spec让programmer编程更困难一些。
ADT设计
creator:构造器,如Integer.valueOf()
producer:生产器,如concat()
observer:观察器,如size()
mutator:变值器,如List.add()
选择某种特定的表示方式R,进而指定某个子集是“合法”的(RI),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。
具体设计AF和RI:
AF:解释合法的表示值,如AF(field1, field2…) = graph (V, E)
RI:一个条件,描述了什么是“合法”的表示值
Safety from rep exposure:表示泄露安全声明
例子:
面向对象编程
继承
重写/重载
1 | class A { |
== vs. equals
a equals b 充要条件:AF(a) == AF(b)
重写equals必须重写hashCode
equals的hashCode一定要相等
第5章 复用
Guava/Apache Commons
在java中:
- 子类型可以增加方法,但不可删
子类型需要实现抽象类型中的所有未实现方法
子类型中重写的方法必须有相同或子类型的返回值
- 子类型中重写的方法必须使用同样类型的参数
- 子类型中重写的方法不能抛出额外的异常
LSP原则
强行为子类型化
更强的不变量
更弱的前置条件
- 更强的后置条件
即子类型的Spec要父类型Spec强。
1 | List<Integer> list = new ArrayList<>(); |
java里没有协变、反协变,都是重写
1 | Number[] numbers = new Number[2]; |
泛型
ArrayList<String>
is a subtype ofList<String>
List<String>
is not a subtype ofList<Object>
类型擦除
通配符
- Class<?>
- Class<? super A>:A 或 A的父类
- Class<? extends A>:A 或 A的子类
List<Number>
is a subtype of List<? extends Object>
List<Object>
is a subtype of List<? super String>
设计模式
visitor设计模式
Iterator模式
Iterator接口
1
2
3
4
5
6
7
8
9
10public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
public interface Iterable<T> {
...
Iterator<T> iterator();
}Iterator模式让自己的集合类实现Iterable接口。
并自定义MyIterator实现Iterator接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23class MyIterator<E> implements Iterator<E> {
private Iterator<Map.Entry<Track, Set<E>>> iter;
private Iterator<E> iter2;
public MyIterator(Map<Track, Set<E>> map) {
iter = map.entrySet().iterator();
}
public boolean hasNext() {
return iter.hasNext() || (iter2 != null && iter2.hasNext());
}
public E next() {
if (iter2 != null && iter2.hasNext()) {
return iter2.next();
} else {
iter2 = iter.next().getValue().iterator();
return iter2.next();
}
}
}Strategy模式
第六章 可维护性
正则表达式
第七章 异常
针对健壮性优化