可复用性:提高效率,并且经过充分测试,可靠稳定。
定义
软件复用是使用已经存在的软件组成成分来完成软件系统的过程,包括两个方面:面向复用编程(开发出可复用的软件)和基于复用的编程(利用已有的可复用软件搭建应用系统)。
其中,在开发可复用软件时,其开发成本高于一般软件的成本,因为要有足够的适应性。并且因为需要针对更普适的场景,缺少足够的针对性。在使用已有软件进行开发时,往往无法拿来就用,需要适配。
可复用软件的成本:若软件产品的规模较小,则可复用开发模式的成本会高于不复用的开发模式。因为有各种辅助类、接口的开发。当软件的规模增大到一定程度后,可复用软件的成本会小于不复用的开发模式。
度量
复用的频度,复用的代价
分类(级别)
软件构造过程中的任何实体都可能被复用:
但是最主要的复用是在代码层面,代码复用的类型:
- 白盒复用:源代码可见,可修改和扩展,但对其修改增加了软件的复杂度,且需要对其内部充分的了解。实现方式:继承。
- 黑盒复用:源代码不可见,不能修改,只能通过API接口来使用,无法修改代码。实现方式:调用(一个函数一个函数地调用)。
代码层级的复用
- 源代码层级的复用(最低级)
即把你需要的代码复制粘贴到你的工程中,这样会导致你的工程显得过于庞大,不易维护,且很容易造成运行时错误。 - 模块层级的复用(类,接口等)
类是代码复用中最小的单元,不需要源代码,只需要class file 或者 jar/zip,并把这个类加入到classpath中。把类打包并把功能通过API暴露给用户。复用方式:
a. 继承(白盒复用)
b. 委托delegation(黑盒复用):当一个类用另一个类的某些功能时,直接调用某个类的功能。显示委托:直接使用一个对象调用其某个方法。隐式委托:只调用功能,发布命令,并不指明执行者。 - 库文件层级的复用(API/package)
直接调用库文件中的类和方法。主动端是开发者构造的软件实体。 - 系统层级的复用–框架framework
框架是一组具体类、抽象类、及其之间的连接关系,只有骨架,没有血肉。
由framework调用用户的代码。主动端是framework构成的主程序,执行过程中调用开发者缩写的程序。复用方式:
a.白盒框架(继承):重写框架中的某些方法。
b.黑盒框架:通过实现特定接口/delegation 进行框架扩展。
可复用性的外部观察
- 类型可变
子类型赋值给父类型的变量,则父类型的类型可变。泛型也可以适应不同的类型。 - 功能分组
将功能细分,提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作( 及其组合)。 - 实现可变
各子类型中可以提供不同的representations 和abstract function ,但具有同样的specification (pre-condition, post-condition, invariants) ,从而可以适应不同的应用场景。 - 表示独立
内部实现可能会经常变化,但客户端不应受到影响。表示独立性可以提高软件的可复用性。 - 共性抽取
将共同的行为(共性)抽象出来,形成可复用实体:父类、抽象类。