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

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

DIP(Dependence Inversion Principle 反向依賴原則)
依賴反向原則是說,要依賴于抽象,而不要依賴于具體。這也就是我們所說的:要針對接口編程,而不要針對
實(shí)現(xiàn)編程
。之所以是倒置,是因為通常在開始依照需求編程時,我們幾乎總是依賴于具體的實(shí)現(xiàn)。但是,這些
具體的實(shí)現(xiàn)都不易適應(yīng)變化,所以要抽象出一些不變的,本質(zhì)的功能,把可變的留到具體的實(shí)現(xiàn)中去。這種抽
象的過程是前面過程的反向,例如,當(dāng)我們需要寫出結(jié)果時,開始時可能會寫到文件里,后來可能會寫到網(wǎng)絡(luò)
流里,等等。抽象的結(jié)果是寫這個功能。針對接口編程是一個不可能過分強(qiáng)調(diào)的原則。接口就像高樓大廈中層
與層之間,戶與戶之間的防火墻;大船巨艦中的隔離艙。軟件的更新有時就像水火一樣難以預(yù)料和不可避免
(所以我們叫它軟件而不是硬件),而接口會適當(dāng)?shù)仄帘诬浖滤鶐淼母膭訑U(kuò)散(連鎖傳播)。通常,類
的依賴性由這個原則和組合
/繼承原則主導(dǎo),而不是由繼承主導(dǎo)。

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

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