原文鏈接 - 面向對象的設計原則
2 面向對象的設計原則
2.1 面向對象設計的五大原則
2.1.1 單一職責原則(Single Pesponsibility Principle,SRP)
- 一個是避免相同的職責分散到不同的類中,另一個是避免一個類承擔太多責任
- 可以減少類之間的耦合,提高類的複用性
- 工廠模式允許你在代碼執行時實例化對象
- 命令模式也是 SRP 的體現,命令模式分離“命令的請求者”和“命令的實現者”方面的職責
- 代理模式也體現了 SRP
- SRP 不只是對類設計有意義,對以模塊、子系統爲單位的系統架構設計同樣有意義
2.1.2 接口隔離原則(Interface Segregation Principle,ISP)
- 客戶端不應該是被迫實現一些他們不會使用的接口
- 一個類對另一個類的依賴性應當是建立在最小的接口上的
- 接口污染就是爲接口添加不必要的職責
- “接口隔離”其實就是定製化服務設計的原則,使用接口的多重繼承實現對不同的接口的組合,從而對外提供組合功能 – 達到“按需提供服務”
- 對於接口的污染
- 利用
委託
分離接口 - 利用
多繼承
分離接口
- 利用
2.1.3 開放-封閉原則(Open-Close Principle,OCP)
- Open,模塊的行爲必須是對外開放的、支持擴展的,而不是僵化的
- Closed,在對模塊的功能進行擴展時,不應該影響或大規模的影響已有的程序模塊
- 核心思想就是對抽象編程,而不對具體編程,因爲抽象相對穩定
- 在設計方面充分應用“抽象”和“封裝”的思想
- 在系統功能編程方面應用面向接口的編程
2.1.4 裏式替換原則(Liskov Substitution Principle,LSP)
- 子類必須能替換成他們的基類
- 子類型必須能夠替換掉他們的父類型、並出現在父類能夠出現的任何地方。它指導我們如何正確的進行繼承與派生,併合理的重用代碼
- LSP 主要是
針對繼承
的設計原則 - 如何遵守該設計原則呢?
- 父類的方法都要在之類中實現或重寫,並且派生類只實現其抽象類中聲明的方法,而不應當給出多餘的方法定義或實現
- 在客戶端程序中只應該使用父類對象而不應當直接使用之類對象,這樣可以實現運行期綁定(動態多態)
- PHP 對 LSP 的支持並不好,缺乏向上轉型等概念
2.1.5 依賴倒置原則(Dependence Inversion Principle,DIP)
- 上層模塊不應該依賴下層模塊,它們共同依賴於一個對象(父類不能依賴子類,它們都要依賴抽象類)
- 抽象不能依賴於具體,具體應該依賴於抽象
- 專門由一個程序檢測配置是否正確(如所依賴的類文件是否存在)以及加載配置所依賴的實現,這個檢測程序,就稱爲
IOC容器
- 一般認爲,
依賴注入
(DI)和依賴查找
(DS)是 IOC 的兩種實現
2.3 面向對象的思考
- PHP 不是一門很好的面向對象的語言,因爲其無法做到完全面向對象,也無法優雅實現面向對象。
- 在 PHP 的開發中應該靈活使用面向對象的特性和設計原則