本文转载自http://wasiker.javaeye.com/blog/232174
软件的可维护性和可复用性
关键字: 设计模式 可维护性 可扩展性
一般来说,一个易于维护的系统,就是复用率较高的系统;一个复用率较好的的系统,就是一个易于维护的系统。但是,实际上,可维护性和可复用性是两个独立的目标。
软件系统的可维护性:
软件维护就是软件的再生。一个好的软件设计,必须能够允许新的设计要求以比较容易和平稳的方式加入到已有的系统中去,从而使这个系统能够不断的的焕发出活力。
一个可维护性较好的系统,应当允许维护工作能够以容易、准确、安全和经济的形式进行。
导致可维护性较低的原因:
1.过于僵硬:在系统中加入一个新的功能,不管大小都很难,不仅意味着建造一个独立的新的模块,而且因为这个新功能会波及很多其他模块,最后成跨越几个模块的改动。
2.过于脆弱:与软件的过于僵硬同时存在,是软件系统在修改已有代码时过于脆弱。对一个地方的修改,往往会导致看上去没有什么关系的另外一个地方发生故障。
3.复用率低:所谓复用,就是指一个软件的组成部分,可以在同一个项目的不同地方甚至另一个项目中重复使用。复用率低,指当一段代码,函数,模块的功能可以在新的模块或新的系统使用,但是已有代码依赖于其他很多东西,很难分开。
4.黏度过高:一个改动可以保存原始设计意图和原始设计框架的方式进行,也可以以破坏原始意图和框架进行。第一种方法对系统的未来有利,第二种办法是权宜之计,可以解决短期的问题,但是会牺牲中长期的利益。如果一个系统中使用第二种方法比使用第一种方法容易,那么就是黏度过高。
设计的目标:
1. 可扩张性
2. 灵活性
3. 可插入性
系统的可复用性:
复用性的重要性:
1. 较高的生产效率
2. 较高的软件质量
3. 恰当使用复用可以改善系统的可维护性
传统的复用和面向对象的系统设计中复用的区别
1.传统的复用:代码的剪贴复用;算法的复用;数据结构的复用。
2.面向对象的设计的复用:在OO中数据的抽象化、继承、封装和多态是几个重要的语言特性,这些特性使得一个系统可以在更高的层次上提供可复用性。
数据的抽象化和继承关系使得概念和定义可以复用;
多态性使得实现和应用可以复用;
抽象化和封装可以保持和促进系统的可维护性。
可复用和可维护性的关系
1. 适当的使用复用,可以提高可维护性,即支持可维护性的复用,就是在保持甚至提高系统的可维护性的同时,实现系统的复用。
2. 适当提高系统的可复用性可以提高系统的可扩展性:系统的可扩展性由“开-闭”原则、里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证。
3. 适当提高系统的可复用性,可以提高系统的灵活性。系统的灵活性由“开-闭”原则、迪米特法则、接口隔离原则所保证的。
4. 适当提高系统的可复用性,可以提高系统的可插入性。系统的可插入性由“开-闭”原则、里氏代换原则、组合/聚合复用原则和依赖倒转原则所保证。
复用原则:
1. “开-闭”原则:OCP
2. 里氏代换原则:LSP
3. 依赖倒转原则:DIP
4. 接口隔离原则:ISP
5. 组合/聚合复用原则:CARP
6. 迪米特法则:LoD