天天看點

簡述SOLID的面向對象的設計原則

在這篇博文中,将給大家簡要介紹一下SOLID的面向對象的設計與實作的基本原則。其實這個需要自己做項目和看代碼的體會,個人經驗覺得還是比較有用的。

什麼是SOLID

SOLID是面向對象設計與實作的時候推薦的一個基本的原則,分别是Single Responsibility Principle(單一職能原則),Open Close Principle(開放封閉原則), Liskov’s Substitution Principle (裡氏替換原則),Interface Segregation Principle(接口分離原則)與Dependency Inversion Principle (依賴倒置原則)的英文首字母的大寫縮寫而來。接下面會簡要介紹一些這些原則的基本概念,有一些是自己的了解。

單一職能原則

  • One Responsibility

    單一職能講的是一個類,接口或者方法僅僅有一個職能,這個職能可以很大,也可以很小,但是你可以用一句話就能說明,不是大而全的。 其實設計模式中單體,或者工廠模式就展現了這一點,單體類的職能就是確定僅僅隻有一個類被建立出來。而工廠模式的職能就是封裝了類的建立。

  • One Reason to Change

    一個類僅僅隻有一個理由去變化,當職能唯一的時候,僅僅是因為職能的變化,你的類的實作才可以發生變化。比如說工廠類,你需要建立的對象需要變化了,你的代碼才需要跟着改變。

開放封閉原則

開放封閉将的是任何軟體實體如類,子產品(一般是動态連結庫),方法,接口等應該對擴充開放,而關閉修改。具體的意思就是說,我們應該是以“增加”的方式來應對修改,舉個例子:當我們要增加一個新功能的時候,有一個函數提供了類似的功能,這個時候很多人都習慣比這個函數擴充一個參數什麼的,增加if-else的程式結構架構去處理這樣的情況,這個做法就違背了Open -Close原則,正确的做法應該是增加一個方法來完成,有人問這樣可能有很多重複代碼啊? 這個應該是自己重新寫一個私有方法去封裝 共性的代碼去解決, 以確定原來的方法保持不變。

裡氏替換原則

裡氏替換原則說的是任何基類都可以被子類代替而不影響相關程式子產品的功能。這要求繼承類(子類)不應該修改擴充或者修改基類的功能,注意,這能說的是功能,不是說不能重寫某個方法,而應該是做的是相同的事情,對于函數來說,就是函數簽名需要完成的事。

接口隔離原則

接口隔離原則說的是使用者不應該依賴那些不需要的接口和方法。這個在實際的程式設計中很容易出現,比如說設計了接口A,被類B和C同時繼承了,然後B需要一個新功能,而C不需要,這個時候做法不是在接口A中增加方法,應該是重新設計一個 接口D,讓B繼承D,而C不應該做任何的修改。

依賴倒置原則

依賴倒置原則我的了解是,高層次的子產品(類)不應該依賴低層次的子產品,他們都應該依賴于抽象,或者說是接口。 高層次的子產品是指在類圖中處于上面的子產品,一般是抽象類,接口類等。低層次的子產品一般是相對于高層次而言的,它繼承自高層次的子產品。具體可以參考http://en.wikipedia.org/wiki/Dependency_inversion_principle

在書籍閱讀和代碼閱讀,編寫後,對于面向對象,自己有下面的一些體會:

  • 要對接口程式設計,不要對具體的類。
  • 盡量用組合,不要用繼承。
  • 如果要依賴的話,最好依賴接口,不要依賴具體的類。
  • 在編寫代碼時,對依賴的接口或者子產品的實作不要做過多的假設,完全依賴的是函數簽名。
  • 一個類或者接口的設計時,應該隻有一個原因使它變化,如果有多個,考慮做拆分,這個其實和單一職能原則很像。
  • 考察自己程式或者子產品可能發生變化的部分,然後用接口的形式封裝它們。
  • 松耦合:子產品,類或者程式見應該是松耦合的,依賴越少越好,而且需要定義清晰,設計的時候盡量考慮完全,而不要做修改,而是去做擴充。
  • 高内聚:類或者子產品的内部可以緊緊聯系,說的是,自己實作的部分可以互相聯系的很緊,可以封裝共同的私有函數,公用同樣的類等等。

繼續閱讀