软件的可复用性和维护性
1.软件的可复用性
♦可复用性:复用又叫重用,是重复使用的意思。一般软件的复用率并不高,尤其在国内。复用的好处可以得到较高的生产效率以及随之而来的成本降低、较高的软件质量(错误可以更快的被纠正)以及恰当的使用复用可以改善系统的可维护性。
♦传统的复用:
-
代码剪贴:最初步的复用,每块代码分散在各处,独立的演变,仍需要针对每一块修改和测试。这种复用带来的好处很有限。
-
算法:在已有的成熟算法中选择一个比自己重新开发一个好的多。比如排序算法,这就是算法的复用。
-
数据结构:比如队列、栈、链表,在实践中得到了大量的应用。
♦面向对象设计的复用:在OO中数据的抽象化、继承、封装和多态是几个重要的语言特性,这些特性使得一个系统可以在更高的层次上提供可复用性。
- 抽象化&继承:数据的抽象化和继承关系使得概念和定义可以复用。
- 多态:多态性使得实现和应用可以复用。
- 抽象化&封装:抽象化和封装可以保持和促进系统的可维护性。
♦软件复用的意义:
- 提高生产率:软件复用最明显的好处在于提高生产率,从而减少开发代价。生产率的提高不仅体现在代码开发阶段。在分析、设计及测试阶段同样可以利用重用来节省开销。
- 减少维护代价:好的复用可以减少软件需要维护的部分。
- 提高互操作性:复用经过检验的构件,减少了可能的错误。基于复用技术生产的软件系统,大多使用相同的接口对外实现通信,因此系统将更为有效地实现与其他系统之间的互操作。
- 支持快速原型:可以快速构造出系统可操作的模型,以获得用户对系统功能的反馈。利用可复用构件可以快速有效地构造出应用程序的原型。
- 减少培训开销:使用一个可复用构件库时,可以减少所需的非正式的开销,因为其中的构件都是工程师所熟悉和精通的。
2.软件的可维护性
♦可维护性:即维护人员对该软件进行维护的难易程度,具体包括理解、改正、改动和改进该软件的难易程度。软件维护就是软件的再生。一个好的软件设计,必须能够允许新的设计要求以比较容易和平稳的方式加入到已有的系统中去,从而使这个系统能够不断的的焕发出活力。
♦导致可维护性较低的原因:
-
过于僵硬:在系统中加入一个新的功能,不管大小都很难,不仅意味着建造一个独立的新的模块,而且因为这个新功能会波及很多其他模块,最后成跨越几个模块的改动。
-
过于脆弱:与软件的过于僵硬同时存在,是软件系统在修改已有代码时过于脆弱。对一个地方的修改,往往会导致看上去没有什么关系的另外一个地方发生故障。
-
复用率低:所谓复用,就是指一个软件的组成部分,可以在同一个项目的不同地方甚至另一个项目中重复使用。复用率低,指当一段代码,函数,模块的功能可以在新的模块或新的系统使用,但是已有代码依赖于其他很多东西,很难分开。
-
黏度过高:一个改动可以保存原始设计意图和原始设计框架的方式进行,也可以以破坏原始意图和框架进行。第一种方法对系统的未来有利,第二种办法是权宜之计,可以解决短期的问题,但是会牺牲中长期的利益。如果一个系统中使用第二种方法比使用第一种方法容易,那么就是黏度过高。
♦支持可维护性的三个目标:可扩展性、灵活性、可插入性。
-
可扩展性:允许一个具有同样接口的新类替代旧类,是对抽象接口的复用。客户端依赖于抽象接口,而不是一个具体实现类,使得这个具体类可以被别的具体类替换,而不影响客户端。这提高了系统的可扩展性。系统可扩展性由“开-闭”原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。
-
灵活性:模块相对独立,通信尽可能少。这样当一个模块修改时,对别的模块的影响很小。系统灵活性由“开-闭”原则、迪米特法则、接口隔离原则所保证。
-
可插入性:当一部分不再满足需要时,可以将旧的部分拔出,新的部分插入。系统可插入性由“开-闭”原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。
3.面向对象设计原则
♦同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。最常见的7种面向对象设计原则:
♦这些原则首先是复用的原则,遵循这些原则可以有效提高系统的复用性,同时提高系统的可维护性。
【参考:https://www.iteye.com/blog/wasiker-232174】
【参考:https://blog.csdn.net/lovelion/article/details/7536532】
【参考:https://www.sytm.net/ruanjiankaifa/20140210180035.html】
【参考:https://baike.baidu.com/item/%E5%8F%AF%E5%A4%8D%E7%94%A8%E6%80%A7/7157193?fr=aladdin】