可复用
Posted yry1160300116
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可复用相关的知识,希望对你有一定的参考价值。
可复用性的度量,形态和外部观察
第3章介绍了软件构造的核心理论(ADT)与技术(OOP),其核心是保证代码质量、提高代码适应性和复用性。
本章面向一个重要的外部质量指标:可复用性——如何构造出可在不同应用中重复使用的软件模块/API?
5-1节探讨可复用软件的形态与特征,下一节学习“如何构造”。
目录
- 什么是软件复用
- 如何度量复用性
- 可复用组件的级别和形态
- 对可复用性的外部观察
什么是软件复用
软件复用是使用现有软件组件实施或更新软件系统的过程。
软件复用的两个观点:
- 面向复用编程:开发出可复用的软件)
- 基于复用编程:利用已有的可复用软件搭建应用系统
为什么需要复用:
- 降低成本和开发时间
- 经过充分测试,可靠、稳定
- 标准化,在不同应用中保持一致
Development for reuse: 开发可复用的软件
- 开发成本高于一般软件的成本:要有足够高的适应性
- 性能差些: 针对更普适场景,缺少足够的针对性
Development with reuse: 使用已有软件进行开发
- 可复用软件库,对其进行有效的管理
- 往往无法拿来就用,需要适配
如何度量可复用性
软件可复用性的度量需要考虑:
- 复用的机会有多频繁?
- 复用的场合有多少?
- 复用的代价有多大?(包括搜索、获取 、适配、扩展 、实例化 、与软件其他部分的互连)
具有高复用性的软件应该具有以下特征:
- 小、简单
- 与标准兼容
- 灵活可变
- 可扩展
- 泛型、参数化
- 模块化
- 变化的局部性
- 稳定
- 丰富的文档和帮助
JDK中的可重用的库和API:
可复用组件的级别和形态
最主要的复用是在代码层面,但软件构造过程中的任何实体都可能被复用。
代码复用的类型:
- 白盒复用:源代码可见,可修改和扩展
复制已有代码当正在开发的系统,进行修改;可定制化程度高;对其修改增加了软件的复杂度,且需要对其内部充分的了解。 - 黑盒复用:源代码不可见,不能修改
只能通过API接口来使用,无法修改代码;简单清晰;适应性差些。
源代码级别的复用
相关研究1:如何从互联网上快速找到需要的代码片段?
反向研究:如何从源代码中检测出克隆代码(clone code)?
可以在一些网站例如:grepcode.com;github.com;searchcode.com上搜索代码,进行代码复用。
模块级别的复用:类/抽象类/接口
复用类的方法:
- 继承(Inheritance):类扩展了现有类的属性/行为;另外,他们可能会
Override
现有的行为 - 委派(Delegation):委托是一个对象依赖另一个对象来实现其功能的某个子集(一个实体将某个事物传递给另一个实体)。
库级别的复用:API/包
库:一组提供可重用功能的类和方法(API)。
开发者构造可运行软件实体,其中涉及到对可复用库的调用。
Java中有很多的库可以复用,例如Guava:Google的Java核心库;Apache Commons等。
系统级别的复用:框架
框架:一组具体类、抽象类、及其之间的连接关系 。
Framework作为主程序加以执行,执行过程中调用开发者所写的程序。开发者根据 framework的规约,填充自己的代码进去,形成完整系统。
将framework看作是更大规模的API复用,除了提供可复用的API,还将这 些模块之间的关系都确定下来,形成了整体应用的领域复用。开发者的任务就是增加新代码、对抽象类进行具体化。展开来说就是以下几点:
- 通常通过选择性覆盖来扩展框架; 或者程序员可以添加专门的用户代码来提供特定的功能—定义继承了抽象类祖先操作的具体类
- Hook方法,它被应用程序覆盖以扩展框架。 Hook方法系统地将应用程序域的接口和行为与应用程序在特定上下文中所需的变体解耦。
- 控制反转,由第三方的容器来控制对象之间的依赖关系,而非传统实现中由代码直接操控。由第三方的容器来控制对象之间的依赖关系,而非传统实现中由代码直接操控。
- 不可修改的框架代码:在接受用户实现的扩展时,框架代码不应该被修改。 换句话说,用户可以扩展框架,但不应修改其代码。
框架也可分为白盒框架和黑盒框架两类。
白盒框架:
- 通过继承和动态绑定实现可扩展性。
- 通过继承框架基类并重写预定义的hook方法来扩展现有功能。
- 通常使用模板方法模式等设计模式来覆盖hook方法。
黑盒框架:
- 通过为可插入框架的组件定义接口来实现可扩展性。
- 通过定义符合特定接口的组件来复用现有功能。
- 这些组件通过委派(Delegation)与框架集成。
对可复用性的外部观察
类型可变
类型可变(泛型):适应不同的类型,且满足LSP。
功能分组
提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作(及其组合)。
实现可变
实现可变:ADT有多种不同的实现,提供不同的representations和 abstract funtion,但具有同样的specification (pre-condition, postcondition, invariants),从而可以适应不同的应用场景。
表示独立
内部实现可能会经常变化,但客户端不应受到影响。需要实现表示独立性、信息隐藏。
共性抽取
将共同的行为(共性)抽象出来,形成可复用实体 。
以上是关于可复用的主要内容,如果未能解决你的问题,请参考以下文章