如何提高一个软件系统的可维护性和可复用性是面向对象的设计要解决的核心问题。
Bob大叔(Robert C. Martin)在00年Design principles and Design Patterns 和96年的Engineering Notebook 中指出,导致软件腐化的原因有四:过于僵硬(不能添加功能),过于脆弱(不能修改),复用率低(相互依赖),黏度过高(改动总是难以保持原始设计意图)。
Peter Coad 提出好的系统设计应有以下性质:可扩展性(过于僵硬的反面),灵活性(过于脆弱的反面),可插入性(黏度过高的反面)。
如何才能做出符合这三项要求的设计?关键是提高软件系统的可维护性和可复用性。
提高复用(重用)性的好处:
1. 较高的生产率
2. 较高的软件质量(内聚已修改)
3. 恰当的复用可改善可维护性??
a. 可提高可扩展性
允许具有同样接口的类相互替代,是对抽象接口的复用。客户端依赖于抽象接口(由开闭原则,里氏代换原则,依赖倒置原则和组合/聚合原则所保证)
b. 可提高系统的灵活性
模块应内聚,并尽可能提供减少与其它模块的通信,这样修改的压力就不会传递。(由开闭原则,迪米特法则和接口隔离原则所保证)
c. 可提高可插入性
抽象层封装商业逻辑的重要行为,具体实现有实现层给出,新类可以代替旧类。(由开闭原则,里氏代换原则,依赖倒置原则和组合/聚合原则所保证 )
传统复用:算法复用,数据结构复用
抽象和继承使得概念和定义可复用;
多态使得实现和应用可复用;
抽象与封装可以保持和促进系统的可维护性。
这样焦点由函数和算法转移到了商业逻辑的抽象层次。(发生倒转)。并不是细节不重要而是这些细节部分的复用已经做的很好了。而抽象层次是提高复用性和可维护性的关键。
设计原则首先是复用的原则,遵守这些原则可以有效地提高系统的复用性,同时提高系统的可维护性。
学习设计模式对可复用和可维护性的帮助
凡是有理论的地方,就有如何恰当的将理论应用到实践中的问题,设计模式是对学习OO设计原则的具体指导。