本章面向另外一個質量指標:可維護性——軟件發生變化時,是否能夠以很小的代價適應變化?
本節是宏觀介紹:(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 總結】