软件的可复用性和维护性
1.软件的可维护性
软件开发是一个比较快速的过程,一般只需要半年时间。但是系统的维护却是一个长期的过程,需要很多年。并且在一个软件项目的周期内,花费在维护上面的钱,是花费在原始开发上面的钱的两倍。作为一个开发人员必须要认识到,软件的维护就是软件的再生。一个好的软件设计,必须能够允许新的设计要求以较为容易和平稳的方式加入到已有的系统中去,从而使这个系统能够不断的焕发青春。 一个可维护性较好的系统,应当允许维护工作能够以容易、准确、安全和经济的形式进行。
1.1导致软件可维护性低的原因
(1)过于僵硬,很难在一个软件系统里加入一个新的性能,哪怕是很小的都很难。这是因为加入一个新新能,不仅仅意味建造一个独立的新模块,而且因为这个新性能会波及很多其他模块,最后变成跨越几个模块的改动。使得一个起初只需要几天的工作,最后变成持续好久的作战。
(2)过于脆弱,与软件过于僵硬同时存在的,是软件系统在修改已有代码时过于脆弱。对一个地方的修改,往往会导致看上去没有什么关系的另一个地方发生故障。尽管在修改之前,设计师们会竭尽所能预测可能的故障地点,地那是在修改完成之前,系统的原始设计师们甚至都无法确切预测到可能会波及到的地方。这种一碰就碎的情况,造成软件系统过于脆弱。
(3)复用率低,发现一段代码,函数,模块所做的事情是可以在新的模块、或者新系统中使用的时候,他们总会发现,这些已有的代码依赖于一大堆其他的东西,以至于很难将他们分开。最后,他们发现最好的办法就是不去“碰”这些已有的东西,而是重新写自己的代码。他们可能会使用源代码黏贴的办法,以最原始的复用方式,节省一些时间。这样的系统就有复用率低的问题。
(4)黏度过高,一个改动可以保持原始的设计意图和原始设计框架的方式进行,也可以破坏原始意图和框架的方式进行。第一种办法无疑会对系统的未来有利,第二种办法是权宜之计,可以解决短期问题,但是会牺牲中长期的利益。如果总是第二种办法比第一种办法容易,就叫做黏度过高。一个黏度过高的系统会诱使维护它的程序员采取错误的维护方案,并惩罚采取正确维护方案的程序员。
1.2设计的目标
可扩展性、灵活性、可插入性。这三条性质就是一个系统设计应当达到的目标。
(1)可扩展性,“过于僵硬”的属性的反面,新的性能很容易加入到系统中去。可扩展性要求一个新系统的加入,应该不会影响原有的功能,如果不是,则这个系统就不是扩展型很好的系统。
(2)灵活性,可以允许代码修改平稳的发生,而不会波及到很多其他的模块,这就是灵活性。比如一辆汽车的空调发生了故障,技师修理了空调。如果空调修好之后,发现系统的发动机不能启动了,这就不是一个灵活的系统。
(3)可插入性,很容易的将一个类抽出去,同时将另一个有同样接口的类加入进来,这就是可插入性。比如应该可以很容易的将一辆汽车的防撞气囊取出来,换上一个新的。如果气囊拿出来后,汽车的传动杆不工作了,那么这个系统就不是一个可插入性很好的系统。
2.系统的可复用性
2.1复用的重要性,①较高的生产效率;②较高的软件质量;③恰当使用复用可以改善系统的可维护性。更重要的是,复用与系统的可维护性有直接的关系。
2.2传统的复用,①代码的黏贴复用;②算法的复用;③数据结构的复用。
2.3可维护性与复用的关系
传统的复用方案的一个致命缺陷就是复用常常是以破坏可维护性为代价的。比如两个模块A和B同事使用另一个模块C中的功能。那么当A需要C增加一个新的行为的时候,B有可能不需要、甚至不允许C增加这个新行为。如果坚持使用复用,就不得不以系统的可维护性为代价;而如果从保持系统的可维护性出发,就只好放弃复用。可维护性与可复用性是有共同性的两个独立特性,他们就像是两只同时在奔跑的兔子,方向并不能一直保持一致。因此,一个重要的概念就是支持可维护性的复用,也就是在保持甚至提高系统的可维护性的同时,实现系统的复用。
2.4面向对象设计的复用
数据的抽象化、继承、封装和多态性是面向对象语言最重要的语言特性,这些特性使得一个系统可以在更高的层次上提供可复用性。数据的抽象化和继承关系使得概念和定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和催进系统的可维护性。抽象层次是一个应用系统做战略性判断和决定的地方,那么抽象层次就应当是较为稳定的,应当是复用的重点。如果抽象层次的模块相对独立于具体层次的模块的话,那么具体层次内部的变化就不会影响到抽象层次的结构,所以抽象层次的模块的复用就会较为容易。

浙公网安备 33010602011771号