OO的五大原則是指SRP、OCP、LSP、DIP、ISP
SRP(Single Responsibility Principle 單一職責原則)
對象的功能應該單一

OCP(Open Close Principle 開閉原則)
開閉原則是說,所有軟件模塊都應該可以擴展,但不可以修改。遵循這個原則的關鍵在于抽象化。我們在寫一
個模塊時,不論是一個類,還是一個構件,都應該認真思考它的真正功能,它對其它模塊的依賴性,輸入和輸
出,等等。分離出它的可變部分(例如,用接口或外部配置等),對不變部分進行封裝。這些不變部分就是這
個模塊的本質。這里需要說明的是,在對不變部分進行封裝時,我們如何定義不變的部分。在數學中,當我們
談到不變量時,總是要指明它是在什么變化下的不變量。否則是沒有意義的,因為在一種變化下的不變量很有
可能在另一種變化下就不是不變量了。所以,當我們定義不變的部分時,首先要明確它的變化范圍。但是,在
軟件開發中,很難事先準確的知道這些變化,很多時候是憑經驗或行業知識來判斷的。所以,這個原則多多少
少帶有主觀性,更像一個總綱而不像一個硬性的法律條文。
Martin Fowler的書 Analysis Patterns講解了一些實
際經驗,有興趣的讀者可以參考。下面這些原則是講如何安排依賴性使得模塊具有良好的封閉性,可重用性和
可維護性
 

DIP(Dependence Inversion Principle 反向依賴原則)
依賴反向原則是說,要依賴于抽象,而不要依賴于具體。這也就是我們所說的:要針對接口編程,而不要針對
實現編程
。之所以是倒置,是因為通常在開始依照需求編程時,我們幾乎總是依賴于具體的實現。但是,這些
具體的實現都不易適應變化,所以要抽象出一些不變的,本質的功能,把可變的留到具體的實現中去。這種抽
象的過程是前面過程的反向,例如,當我們需要寫出結果時,開始時可能會寫到文件里,后來可能會寫到網絡
流里,等等。抽象的結果是寫這個功能。針對接口編程是一個不可能過分強調的原則。接口就像高樓大廈中層
與層之間,戶與戶之間的防火墻;大船巨艦中的隔離艙。軟件的更新有時就像水火一樣難以預料和不可避免
(所以我們叫它軟件而不是硬件),而接口會適當地屏蔽軟件更新所帶來的改動擴散(連鎖傳播)。通常,類
的依賴性由這個原則和組合
/繼承原則主導,而不是由繼承主導。

LSP(Liskov Substitution Principle 里氏替換原則)
“老鼠的兒子會打洞”,子類應該具備父類的特征。

ISP(Interface Segregation Principle 接口分隔原則)
盡量提供有針對性符合功能特點的簡單接口,而不是包含很多方法的大而總接口。
接口分離原則是說,不相關的功能應在不同的接口里。不然,在需要一個功能時也不得不同時也依賴于另一個
沒必要的功能。例如,在早期的 EJB 中,數據庫調用和遠程調用混在一起,在不需要遠程調用時恰好是最糟糕
的組合。這個原則說的是,接口的依賴性寬度越窄越好。