软件的可复用性和维护性

  对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。

1.可维护性

   软件开发是一个比较快速的过程,一般只需要半年时间。但是系统的维护却是一个长期的过程,需要很多年。并且在一个软件项目的周期内,花费在维护上面的钱,是花费在原始开发上面的钱的两倍。软件的维护和普通产品的维护不同,它不仅包含清除错误和缺陷,而且包括对已有性能的扩充,以满足新的设计要求。软件的维护就是软件的再生,一个好的软件设计必须能够允许新的设计要求以比较容易和平稳的方式加入到已有的系统中去,从而使这个系统能够不断的焕发青春。

1.1典型的软件生命周期

  在项目开始后,系统设计师按照系统的设计要求开始系统设计。这个系统,首先存在于设计师的头脑中,然后存在于设计图纸上,然后变成一个原型系统,最终成为一个可以交付客户使用的产品。但是不久,客户看了运行的系统,又提出了一些“小小的”修改要求,这些要求都是客户在提出系统设计要求的时候遗忘的一些“小”问题。设计师讨论之后,给出了一些设计上面的修改。由于这些修改于现有系统的设计并不一定相容,所以设计师不得不采取一些权宜之计。可是毕竟权宜之计不是长久的办法,这些小的问题越来越多,而且其中有一些变成了系统的肿瘤。随着时间的流逝,这些肿瘤变成了系统中最主要的组成部分,这些代码随着问题的增多以至于没有人愿意去维护他。在抱怨了软件系统的维护之昂贵之后,客户决定投入一笔资金,一个新的系统将被设计出来,而这个新系统将具有这个正在死去的系统的所有功能,并且取代这个已经被遗留的系统。

1.2导致一个软件可维护性低的原因

  ①过于僵硬

  很难在一个软件系统里加入一个新的性能,哪怕是很小的都很难。一个新功能的加入往往会波及很多与它有联系的其他模块,最后变成跨越几个模块的改动,使得一工作量增大。由于这种设计上的缺陷,使得项目经理不敢轻易向系统加入新功能。这就造成一个软件系统一旦做好,就不能增加新功能的僵化情况。

  ②过于脆弱

  与软件过于僵硬同时存在的,是软件系统在修改已有代码时过于脆弱。对一个地方的修改,往往会导致看上去没有什么关系的另一个地方发生故障。这种一碰就碎的情况,造成软件系统过于脆弱。

  ③复用率低

  所谓复用,就是指一个软件的组成部分,可以在同一个项目的不同地方甚至另一个项目中重复使用。每当程序员发现一段代码,函数,模块所做的事情是可以在新的模块、或者新系统中使用。但是他们发现这些东西依赖的东西太多,很难将其剥离开来。因此最好的方法是重新写,这种系统有复用率低的特点。

  ④黏度过高

  一个改动可以以保留原始设计意图和原始设计框架方式进行,也可以以破坏原始意图和框架的方式进行。第一种对系统的未来有利,第二种是权宜之计,可以解决短期 问题,但是会牺牲中长期的利益。如果一个系统的设计使得维护总是采用第二种方式比第一种容易,那么就叫做黏度过高。这会诱使程序员采取不正确的维护方案。

1.3设计的目标

  ①可扩展性

  新的性能很容易加入到系统中去,就是可扩展性。这是过于僵硬的反面。

  ②灵活性

  可以允许代码修改平稳的发生,而不会波及到很多其他的模块,这就是灵活性。是过于脆弱的反面。

  ③可插入性

  可以很容易的将一个类抽出去,同时将另一个有同样接口的类加入进来,这就是可插入性,是“粘稠过高”的反面。

2.可复用性

  复用又叫重用,是重复使用的意思。目前,一般软件的复用率并不高。

2.1可复用的重要性

  ①较高的生产效率;

  ②较高的软件质量;

  ③恰当使用复用可以改善系统的可维护性;

  ④更重要的是,复用与系统的可维护性有直接的关系。

2.2传统的复用

  1.代码的剪贴复用:最初步的复用,每块代码分散在各处,独立的演变,仍需要针对每一块修改和测试。这种复用带来的好处很有限;2.算法的复用:在已有的成熟算法中选择一个比自己重新开发一个好的多。比如排序算法。这就是算法的复用;3.数据结构的复用:比如队列、栈、链表,在实践中得到了大量的应用。

2.2面向对象的复用

  在一个面向对象的语言中,数据的抽象化、继承、封装和多态性等特性使得一个系统可以在更高的层次上提供复用性。抽象化和继承关系使得概念和定义可以复用。多态性使得实现和应用可以复用。抽象化和封装可以保持和促进系统的可维护性。

2.3复用性的提高

  首先提高复用性,可以提高可扩展性。允许一个具有同样接口的新类替代旧类,是对抽象接口的复用。客户端依赖于抽象接口,而不是一个具体实现类,使得这个具体类可以被别的具体类替换,而不影响客户端。这提高了系统的可扩展性,由“开-闭”原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。其次可以提高灵活性。模块相对独立,通信尽可能少。这样当一个模块修改时,对别的模块的影响很小。这由“开-闭”原则、迪米特法则、接口隔离原则保证的。提高复用性,也可以提高系统的可插入性。当一部分不再满足需要时,可以将旧的部分拔出,新的部分插入。可插入性由“开-闭”原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。

 

参考链接:http://blog.sina.com.cn/s/blog_6ab284e40102vo8y.html

     https://blog.csdn.net/crazzy_lp/article/details/84615403

     https://www.iteye.com/blog/mazhongjia-726491

     https://blog.51cto.com/zhangxu2713/790487

posted @ 2020-03-12 21:01  kkkyl  阅读(583)  评论(0)    收藏  举报