本章面向另外一个质量指标:可维护性——软件发生变化时,是否能够以很小的代价适应变化?
本节是宏观介绍:(1)什么是软件维护;(2)可维护性如何度量;(3)实现高可维护性的设计原则——很抽象。html
【内聚性】编程
【耦合性】设计模式
更多请参考 王永迪的专栏 浅谈高内聚低耦合框架
综述:设计模式前五个原则,偏偏是告诉咱们用抽象构建框架,用实现扩展细节的注意事项而已:运维
单一职责原则告诉咱们实现类要职责单一;里氏替换原则告诉咱们不要破坏继承体系;依赖倒置原则告诉咱们要面向接口编程;接口隔离原则告诉咱们在设计接口的时候要精简单一;迪米特法则告诉咱们要下降耦合。而开闭原则是总纲(实现效果),它告诉咱们要对扩展开放,对修改关闭。模块化
SRP | The Single Responsibility Principle | 单一责任原则 |
OCP | The Open Closed Principle | 开放封闭原则 |
LSP | The Liskov Substitution Principle | 里氏替换原则 |
ISP | The Interface Segregation Principle | 接口分离原则 |
DIP | The Dependency Inversion Principle | 依赖倒置原则 |
【SRP 单一责任原则】post
【OCP 开放封闭原则】性能
1 // Open-Close Principle - Bad example 2 class GraphicEditor { 3 public void drawShape(Shape s) { 4 if (s.m_type==1) 5 drawRectangle(s); 6 else if (s.m_type==2) 7 drawCircle(s); 8 } 9 public void drawCircle(Circle r) 10 {....} 11 public void drawRectangle(Rectangle r) 12 {....} 13 } 14 15 class Shape { int m_type; } 16 class Rectangle extends Shape { Rectangle() { super.m_type=1; } } 17 class Circle extends Shape { Circle() { super.m_type=2; } }
上面代码存在的问题:单元测试
改进以后的代码:测试
// Open-Close Principle - Good example class GraphicEditor { public void drawShape(Shape s) { s.draw(); } } class Shape { abstract void draw(); } class Rectangle extends Shape { public void draw() { // draw the rectangle } }
【LSP 里氏替换原则】
【ISP 接口分离原则】
【DIP 依赖转置原则】
进行抽象改进后:
【SOLID 总结】