1. 白盒复用
源代码可见,可修改和扩展。复制已有代码到正在开发的系统进行修改,可定制程度高,对其修改增加了软件的复杂度,且需要对源代码有充分了解。
2. 黑盒复用
源代码不可见,不能修改。只能通过API接口来使用,无法修改代码。简单清晰但适应性差。
3. 库级别复用:API/包
操作系统把某些复杂的操作写在一个函数里面,编译成一个组件,随操作系统一起发布,并配上说明文档,程序员只需要简单地调用这些函数就可以完成复杂的工作,让编程变得简单有趣。
这些封装好的函数,就叫做API(Application Programming Interface),即应用程序编程接口。
通俗易懂来讲,别人写好的代码,或者编译好的程序,提供给你使用,就叫做API。你使用了别人代码(或者程序)中的某个函数、类、对象,就叫做使用了某个API。
4. 系统级复用:框架
一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法。
通俗易懂来讲,框架不仅提供API还确定了模块之间的关系,开发者根据规约填充代码。
1)黑盒框架:通过实现特定接口/delegation进行框架扩展
2)白盒框架:通过代码层面的继承进行框架扩展
5. LSP原则
子类型多态:客户端可用统一的方式处理不同类型的对象
- 子类型可以增加方法,但不可以删除方法
- 子类型需要实现抽象类型中的所有未实现方法
- 协变:子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
- 逆变:子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
- 子类型中重写的方法不能抛出额外的异常
- Also applies to specified behavior (methods):
Same or stronger invariants 更强的不变量
Same or weaker preconditions 更弱的前置条件
Same or stronger postconditions 更强的后置条件