面向對象編程原則

  1. 單一職責原則
  2. 開閉原則OCP:模塊應該對擴展開放,但是對修改關閉。

例如需要調用各種類型的傳感器進行狀態檢查。面向對象方法可以設計爲父類Sensor作爲對外的接口:read();enable();disable(),然後子類是各種具體的傳感器,子類中重寫這些方法。當需要添加新的傳感器時,只需要增加新的子類,父類不用修改,對外的接口不變。不會影響其它傳感器的功能。如果是面向過程方法,比較好的的方法是,實現一個調度函數,裏面根據不同的傳感器類型,調用對應的傳感器處理函數。但是這樣每次增加傳感器都需要修改這個調度函數,修改不當時可能會導致這個調度函數的功能不正常,影響其它傳感器的工作。

3、liskov里氏替換原則(LSP):子類可以替換它們的父類。面向對象的設計關注的是對象的行爲,它是使用“行爲”來對對象進行分類的,只有行爲一致的對象才能抽象出一個類來。我經常說類的繼承關係就是一種“Is-A”關係,實際上指的是行爲上的“Is-A”關係,用“Act-As”來描述更合適。從屬性上來講正方形是一種長方形,但是如果有一個方法是畫長寬比是2:1的長方形,那麼這個方法顯然不適用於正方形。所以正方形不能作爲長方形的子類。里氏替換原則目的就是要保證繼承關係的正確性。我們在實際的項目中,是不是對於每一個繼承關係都得費這麼大勁去斟酌?不需要,大多數情況下按照“Is-A”去設計繼承關係是沒有問題的。只有極少的情況下,需要你仔細處理一下。這類情況對於有些開發經驗的人,一般都會覺察到,是有規律可循的。最典型的就是使用者的代碼中必須包含依據子類類型執行相應的動作,就說明違反了里氏替換原則。

4、依賴倒置原則(Dependence Inversion Principle,DIP)是客戶模塊要依賴於抽象接口,不要依賴於具體實現。上面OCP的例子也適用於這裏。建議除了is-a不要使用繼承。之所以叫做依賴倒置是因爲這裏底層組件依賴於高層的抽象。一般的依賴都是由上向下的。比如工廠模式就使用了依賴倒置原則。

5、合成複用原則(Composite Reuse Principle, CRP):儘量使用對象的組合,而不是繼承來達到複用的目的。這樣降低了類與類之間的耦合性,一個類的變化對其它類造成的影響相對較少。has-a的關係使用組合來表達。通常將新類中嵌入的現有類的對象聲明爲private。但是如果組合不僅僅是底層設計的一部分,也是問題分析的一部分,那麼將嵌入類的對象聲明爲public將有助於客戶端理解和使用類。

6、迪米特法則(Law of Demeter簡寫爲LoD)又叫作最少知識原則(Least Knowledge Principle 簡寫LKP),就是說一個對象應當對其他對象有儘可能少的瞭解,只和你的密友談話,減少類之間的依賴。比如外觀模式就應用了迪米特法則。

7、接口分離原則,對不同的客戶端使用獨立的接口。爲的是當一個客戶端有特殊要求而修改接口時,不會影響其它客戶端的功能。但是這樣重複太多,需要根據實際情況進行斟酌。可以將所有客戶端都使用的相同的方法放在父類中,子類中放置爲不同的客戶端提供的不同的方法。如果有子類有需求修改父類中的方法,則在對應子類中重寫這個方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章