复用度的度量、形态与外部表现
{ProgrammingForReuse:面向复用的编程ProgrammingWithReuse:基于复用的编程
复用:
⎩⎪⎪⎨⎪⎪⎧源代码级别:方法、语句模块级别:类、接口库级别:API(用来调用)构架级别:框架(自己填写内容)

{白盒复用:直到复用的东西的实现黑盒复用:不知道复用的东西的内部实现(尽量用黑盒)
{白盒框架:通过继承扩展黑盒框架:通过委派扩展
模块复用:
{继承(inheritance)委派(delegation)
面向复用的软件构造技术
LSP原则
LSP原则:子类型多态:用父类是可以用子类无条件的替换
为了实现LSP,我们要做到:
- 子类型的方法只增不减
- 子类型实现了抽象的父类中没有实现的方法
- 重写的方法,参数与返回值与父类的相同,不能抛出更多的异常
- 子类的spec:RI更强,前置条件pre相同或更弱,后置条件post相同或更强

{子类型参数:逆变(JAVA会当作重载)子类型返回值/异常:协变
{逆变:具体→抽象协变:抽象→具体
注:
- 泛型不能改变:类型擦除→用通配符解决<? extends 父类/接口>/<? super 子类>
- 数组可以:但敲定后就不可变了
委派(Comparator)
用另一个对象
继承与委派:
{继承(inheritance):要大部分的功能,类(class)层面的委派(delegation):要小部分的功能,对象(object)层面的

CRP原则:一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
⎩⎪⎪⎨⎪⎪⎧Dependency:临时性的委派,在用的时候以参数方式传入,依赖关系Association:永久性的委派,rep里保存,关联关系(在创建的时候传入)Composition:更强的Association,在创建时自动生成Aggregation:更弱的Association,在创建时传入,可以通过函数更改