Chapter 5: Reusability-Oriented Software Construction
Approaches
5.1 Metrics, Morphology and External
Observations of Reusability
可复用性的度量、形态与外部表现
第3章介绍了软件构造的核心理论(ADT)与技术(OOP),其核心是保证代码质量、提高代码安全性。
本章面向一个重要的外部质量指标:可复用性——如何构造出可在不同应用中重复使用的软件模块/API?
5-1节探讨可复用的软件应该“长什么样”,下一节学习“如何构造”
- 可复用性:
a) 降低成本和开发时间。
b) 经过充分测试,可靠、稳定。
c) 标准化。 - Development for reuse: 开发可复用的软件
a) 开发成本高于一般软件的成本:要有足够高的适应性
b) 性能差些:
针对更普适场景,缺少足够的针对性 - Development with reuse: 使用已有软件进行开发
- 代码复用类型:
a) 白盒复用:源代码可见,可修改可扩展,定制化程度高。
b) 黑盒复用:源代码不可见,不能修改。(只能通过API接口来使用,无法修改代码) - 框架:一组具体类、抽象类、及其之间的链接关系。开发者根据framework的规约,填充自己的代码进去,形成完整系统
- External observations of reusability
a) 类型可变(泛型)
b) 功能分组
c) 实现可变(ADT有多种不同的实现,提供不同的RI和AF,但spec相同)
d) 表示独立
e) 共性抽取
5.2 Construction for Reuse
面向复用的软件构造技术 - Liskov Substitution Principle (LSP)
Compiler-enforced rules in Java (static type checking)
子类型可以增加方法,但不可删
子类型需要实现抽象类型中的所有未实现方法
子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
子类型中重写的方法不能抛出额外的异常
Also applies to specified behavior (methods):
更强的不变量
更弱的前置条件
更强的后置条件 - 强行为子类型化
- 协变:
父类型->子类型:越来越具体specific
返回值类型:不变或变得更具体
异常的类型:也是如此 - 逆变:
父类型->子类型:越来越具体specific
参数类型:要相反的变化,要不变或越来越抽象 - 数组是协变的,泛型是反协变的。
- 委托与组合:
a) 委托:
以排序为例:实现comparator接口并override compare函数。
或者让ADT实现Comparable接口,然后Override compareTo方法
委派/委托:一个对象请求另一个对象的功能。
委托模式:通过运行时动态绑定,实现对其他类中代码的复用。
委托发生在object层面,继承发生在class层面。