Chapter 5: Reusability-Oriented Software Construction Approaches
第5章:面向重用的软件构建方法
5.1 Metrics, Morphology and External Observations of Reusability
可复用性的度量、形态与外部表现
第3章介绍了软件构造的核心理论(ADT)与技术(OOP),其核心
是保证代码质量、提高代码安全性。
本章面向一个重要的外部质量指标:可复用性——如何构造出可在不
同应用中重复使用的软件模块/API?
5-1节探讨可复用的软件应该“长什么样”,下一节学习“如何构造”
1 What is Software Reuse?
硬件本身是可重用的
2 How to measure “reusability”?
如何衡量“可重用性”?
3 Levels and morphology of reusable components
可重用组件的层次和形态
Source code level: methods, statements, etc
Module level: class and interface
Library level: API
– Java Library, .jar
Architecture level: framework 框架
module 模块
framework 框架
(2)模块级重用:类/接口
Reusing classes
类是代码重用的原子单位
-源代码不需要,类文件或jar/zip
-只需要包含在类路径中
-可以使用javap工具获取类的公共方法头
非常重要的文档(Java API)
封装可以重用
管理的代码更少
版本控制、向后兼容性仍然存在问题
需要将相关类打包在一起——静态链接
Approaches of reusing a class: inheritance继承
Java提供了一种名为继承的代码重用方法
类扩展现有类的属性/行为
-此外,它们可能覆盖现有的行为
不需要提出只是转发或委托工作的伪方法
更好地捕捉现实世界
通常需要先设计继承层次结构
实现
不能取消属性或方法,因此必须小心不要取消
做过头
Approaches of reusing a class: delegation委托
委托就是一个对象依赖另一个对象来实现其功能的某个子集(一个实体将某些东西传递给另一个实体)
例如,排序器将功能委托给某个比较器
明智的授权支持代码重用
- Sorter可以与任意排序顺序重用
-比较器可以重用任意客户端代码,需要比较整数
显式委托:将发送对象传递给接收对象
隐式委托:根据成员查找规则的语言
可以将委托描述为共享的低级别机制
实体之间的代码和数据。
(3) Library-level reuse: API/Package 库级重用:API/包
库:一组提供可重用功能的类和方法(api)
框架:可重用的框架代码,可以自定义到应用程序中
框架调用回客户端代码
好莱坞的原则:“别给我们打电话。我们会打电话给你。
一个好的API的特征
容易学习
易于使用,即使没有文档
很难被滥用
易于阅读和维护使用它的代码
足够强大来满足需求
容易进化
适合观众
(4) System-level reuse: Framework
Frameworks: domain-level reuse 领域复用
开发者:增加新代码、对抽象类进行具体化
框架设计
框架与应用程序不同
-抽象层次是不同的,因为框架为一系列相关问题提供了解决方案,而不是单个问题。
-为了适应一系列的问题,框架是不完整的,包括热点和挂钩,以允许定制
框架可以根据用于扩展它们的技术进行分类。
白盒框架:
-通过继承和动态绑定实现可扩展性。
现有的功能是通过子类化框架基类和覆盖预定义的钩子方法来扩展的
-通常使用模板方法模式之类的设计模式覆盖钩子方法。
黑盒框架
-通过为可插入框架的组件定义接口来实现可扩展性。
-通过定义符合特定接口的组件来重用现有功能
-这些组成部分通过委托与框架集成。
类库与框架
类库:
-较少领域特定
-提供更小的重用范围。
-类库是被动的;控制流程无约束。
框架:
类为一系列相关的应用程序进行协作。
-框架是活跃的;影响控制流程。
实际上,开发人员经常同时使用这两种方法:
框架通常在内部使用类库来简化
框架的开发。
框架事件处理程序使用类库来执行基本任务(例如字符串处理、文件管理、数值分析……)
组件和框架
组件
-类的自包含实例
-连接在一起形成完整的应用程序。
-定义一组内聚操作的黑盒,
-可以使用基于语法和语义的接口。
组件甚至可以在二进制代码级重用。
•优势在于,应用程序并不总是需要在什么时候重新编译
组件的变化。
框架:
-经常用于开发组件
组件经常被插入黑盒框架。
4可重用性的外部观察
External observations of reusability
Type Variation 类型可变
Routine Grouping 功能分组
Implementation Variation 实现可变
Representation Independence 表示独立
Factoring Out Common Behaviors 共性抽取
可重用组件应该是类型参数化的,以便它们能够适应不同的数据类型(输入、计算和输出);
-可重用模块应该适用于许多不同类型的元素,而不需要开发人员对软件文本执行手动更改。
-换句话说,我们需要一种描述类型参数化模块的工具,也称为泛型模块。
通用性:可重用组件应该是通用的。
B B C A ABCDEF D
5.2 Construction for Reuse
面向复用的软件构造技术
5-1节学习了可复用的层次、形态、表现
本节从类、API、框架三个层面学习如何设
计可复用软件实体的具体技术
1 Designing reusable classes
在OOP中设计可重用类
封装和信息隐藏
继承和覆盖
多态性、子类型和重载
泛型编程
行为子类型与利斯科夫替换原理(LSP)
代表团和组成
(1) Behavioral subtyping and Liskov Substitution Principle (LSP)
行为子类型与利斯科夫替换原理(LSP)
5.2.1
5.2.2
5.3 Design Patterns for Reuse
面向复用的设计模式
除了Framework,5-2节所讨论的其他复用技术都过于“基础”和“细小”,有没有办法做更大规模的复用设计?
本节:几种典型的“面向复用”的设计模式