软件复用是使用现有软件组件实施或更新软件系统的过程。
软件复用的两个观点:
面向复用编程:开发出可复用的软件)
基于复用编程:利用已有的可复用软件搭建应用系统
为什么需要复用:
降低成本和开发时间
经过充分测试,可靠、稳定
标准化,在不同应用中保持一致
Development for reuse: 开发可复用的软件
开发成本高于一般软件的成本:要有足够高的适应性
性能差些: 针对更普适场景,缺少足够的针对性
Development with reuse: 使用已有软件进行开发
复用分为:
白盒复用:复用代码是可用的,但通常需要一些小改造或适应
黑盒复用:通过提供一些“粘合”以组合现有代码的形式重用,但不必更改代码本身,通常是因为您无法访问代码
从另一个角度来看:
代码层级的复用:复制粘贴不推荐。
模块层级的复用:基于类的复用。通过接口将功能提供给用户使用。
类的复用:继承(白盒),委托(黑盒,显式委托常用,隐式委托)
库文件层级的复用:库文件(想选什么库文件就选什么)。
框架层级的复用:框架(主要部分写好,可定制的部分由用户完成)。一组具体类,抽象类及其连接关系。
白盒框架:通过代码层面的继承进行框架扩展。
黑盒框架:通过实现特定接口/委托进行框架扩展。
传统复用方案的致命缺陷是复用常常以破坏可维护性为代价的。因此我们要支持可维护性的复用,即在保持甚至提高系统的可维护性的同时,实现系统的复用。
针对三个目标,可扩展性、灵活性、可插入性。
可扩展性
允许一个具有同样接口的新类替代旧类,是对抽象接口的复用。客户端依赖于抽象接口,而不是一个具体实现类,使得这个具体类可以被别的具体类替换,而不影响客户端。这提高了系统的可扩展性。
系统可扩展性由"开-闭"原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。("开-闭"原则,是指一个软件实体应当对扩展开放,对修改关闭,即可以在不修改的情况下扩展。里氏代换原则,是指任何基类可以出现的地方,子类一定可以出现。依赖倒转原则,是指要依赖于抽象,不要依赖于实现。合成/聚合复用原则,是指要尽量使用合成/聚合,而不是继承关系来达到复用目的。)
灵活性
模块相对独立,通信尽可能少。这样当一个模块修改时,对别的模块的影响很小。
这由"开-闭"原则、迪米特法则、接口隔离原则保证的。
(LY注:迪米特法则,是指一个软件实体应该与尽可能少的其他实体发生相互作用。 接口隔离原则,是指应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口)
可插入性
当一部分不再满足需要时,可以将旧的部分拔出,新的部分插入。
可插入性由"开-闭"原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。
这样,在提高一个系统可维护性的同时,提高了这个系统的可复用性。具体的设计原则有:
这些原则首先是复用的原则,遵循这些原则可以有效提高系统的复用性,同时提高系统的可维护性。