目录
软构9 面向复用的软件构造技术
本章大纲:
- 软件复用的优缺点
- 为复用而construct
- 通用可复用组件的特征
- 开发便携式应用系统的方法
- 可复用组件的级别和形态
- 源代码级别的复用
- 模块级别的复用:类/抽象类/接口
- 库级别的复用:API/包
- 系统级别的复用:框架
源代码复用
类型:
- 白盒复用:源代码可见,可修改和扩展
- 复制已有代码到正在开发的系统,进行修改
- PRO:可定制化程度高
- 其修改增加了软件的复杂度,且需要对其内部充分的了解
- 黑盒复用:源代码不可见,不能修改
- 只能通过API接口来使用,无法修改代码
- Pro:简单,清晰
- 适应性差些
模块级别的复用 class/interface
class 的复用
两种方式:
- inheritance 继承
- delegation 委派
delegation是当一个对象依赖另一个对象来实现其功能的某些子集时
在OOP中设计复用类
方法:
- 子类型多态
- LSP原则
子类型多态
在JAVA中:
- 子类型可以增加方法,但不可删
- 子类型需要实现抽象类型中的所有未实现方法
- 子类型中重写的方法必须有相同类型的返回值或者符合co-variancel的返回值
- 子类型中重写的方法必须使用同样类型的参数或者符合contra-variancel的参数
- 子类型中重写的方法不能抛出额外的异常,抛出相同或者符合co-variance的异常
对方法来说意味着:
- 更强的不变量
- 更弱的前置条件
- 更强的后置条件
LSP原则
LSP is a particular definition of a subtyping relation,called (strong) behavioral subtyping强行为子类型化
在编程语言中,LSP依赖以下限制:
- 前置条件不能强化
- 后置条件不能弱化
- 不变量要保持
- 子类型方法参数:逆变
- 子类型方法的返回值:协变
- 异常类型:协变
协变
父类型→子类型:越来越具体specific
返回值类型:不变或变得更具体
异常的类型:也是如此。
反协变、逆变
父类型>子类型:越来越具体specific
参数类型:要相反的变化,要不变或越来越抽象