可维护性和可复用性是两个独立的目标,就像两只奔跑的兔子,并不总是方向一致的。
对于面向对象的软件系统设计来说,在支持可维护性的同时,提高系统的可复用是一个核心问题。
软件的维护和普通产品的维护不同,它不仅包含清除错误和缺陷,而且包括对已有性能的扩充,以满足新的设计要求。
软件的维护就是软件的再生,一个好的软件设计必须能够允许新的设计要求以比较容易和平稳的方式加入到已有的系统中去,从而使这个系统能够不断的焕发青春。
导致软件可维护性低的真正原因有四个:过于僵硬,过于脆弱,复用率低,粘稠度高。
过于僵硬:很难在一个软件系统里加入一个新的性能,哪怕是很小的都很难。
过于脆弱:对一个地方的修改,往往会导致看上去没什么关系的另一个地方发生故障。
复用率低:所谓复用,就是指一个软件的组成部分,可以在同一个项目的不同地方甚至令一个项目中重复使用。如果程序员在写代码的时候总是发现现有的代码依赖于一大堆其他的东西,而重新写自己的代码,这样的系统将由复用率低的问题。
粘稠过高:有的时候,一个改动可以以保存原始设计意图和原始设计框架的方式进行,也可以是以破坏原始意图和框架的方式进行。如果一个系统设计总是使得第二种方法比第一种方法容易,就叫粘稠过高。
设计的目标:一个好的设计应该具有如下的性质:可扩展性,灵活性,可插入性
可扩展性:新的性能很容易加入到系统中去,就是可扩展性。这是过于僵硬的反面。
灵活性:可以允许代码修改平稳的发生,而不会波及到很多其他的模块,这就是灵活性。是过于脆弱的反面。
可插入性:可以很容易的将一个类抽出去,同时将另一个有同样接口的类加入进来,这就是可插入性,是“粘稠过高”的反面。
复用的重要性:第一,较高的生产效率;第二,较高的软件质量;第三,适当的使用复用可以改善系统的可维护性。
复用不仅仅是代码的复用,代码复用只是复用的初等形式
传统的复用:代码的剪贴复用,算法的复用,数据结构的复用。
在一个面向对象的语言中,数据的抽象化、继承、封装和多态性等特性使得一个系统可以在更高的层次上提供复用性。
抽象化和继承关系使得概念和定义可以复用。多态性使得实现和应用可以复用。抽象化和封装可以保持和促进系统的可维护性。使得复用的焦点不再集中在函数和算法等具体实现细节上,而是集中在最重要的含有宏观商业逻辑的抽象层次上。