OO的五大原則是指SRP、OCP、LSP、DIP、ISP
SRP(Single Responsibility Principle 單一職責(zé)原則)
對(duì)象的功能應(yīng)該單一
OCP(Open Close Principle 開(kāi)閉原則)
開(kāi)閉原則是說(shuō),所有軟件模塊都應(yīng)該可以擴(kuò)展,但不可以修改。遵循這個(gè)原則的關(guān)鍵在于抽象化。我們?cè)趯?xiě)一
個(gè)模塊時(shí),不論是一個(gè)類(lèi),還是一個(gè)構(gòu)件,都應(yīng)該認(rèn)真思考它的真正功能,它對(duì)其它模塊的依賴(lài)性,輸入和輸
出,等等。分離出它的可變部分(例如,用接口或外部配置等),對(duì)不變部分進(jìn)行封裝。這些不變部分就是這
個(gè)模塊的本質(zhì)。這里需要說(shuō)明的是,在對(duì)不變部分進(jìn)行封裝時(shí),我們?nèi)绾味x不變的部分。在數(shù)學(xué)中,當(dāng)我們
談到不變量時(shí),總是要指明它是在什么變化下的不變量。否則是沒(méi)有意義的,因?yàn)樵谝环N變化下的不變量很有
可能在另一種變化下就不是不變量了。所以,當(dāng)我們定義不變的部分時(shí),首先要明確它的變化范圍。但是,在
軟件開(kāi)發(fā)中,很難事先準(zhǔn)確的知道這些變化,很多時(shí)候是憑經(jīng)驗(yàn)或行業(yè)知識(shí)來(lái)判斷的。所以,這個(gè)原則多多少
少帶有主觀性,更像一個(gè)總綱而不像一個(gè)硬性的法律條文。Martin Fowler的書(shū) Analysis Patterns講解了一些實(shí)
際經(jīng)驗(yàn),有興趣的讀者可以參考。下面這些原則是講如何安排依賴(lài)性使得模塊具有良好的封閉性,可重用性和
可維護(hù)性
DIP(Dependence Inversion Principle 反向依賴(lài)原則)
依賴(lài)反向原則是說(shuō),要依賴(lài)于抽象,而不要依賴(lài)于具體。這也就是我們所說(shuō)的:要針對(duì)接口編程,而不要針對(duì)
實(shí)現(xiàn)編程。之所以是倒置,是因?yàn)橥ǔT陂_(kāi)始依照需求編程時(shí),我們幾乎總是依賴(lài)于具體的實(shí)現(xiàn)。但是,這些
具體的實(shí)現(xiàn)都不易適應(yīng)變化,所以要抽象出一些不變的,本質(zhì)的功能,把可變的留到具體的實(shí)現(xiàn)中去。這種抽
象的過(guò)程是前面過(guò)程的反向,例如,當(dāng)我們需要寫(xiě)出結(jié)果時(shí),開(kāi)始時(shí)可能會(huì)寫(xiě)到文件里,后來(lái)可能會(huì)寫(xiě)到網(wǎng)絡(luò)
流里,等等。抽象的結(jié)果是寫(xiě)這個(gè)功能。針對(duì)接口編程是一個(gè)不可能過(guò)分強(qiáng)調(diào)的原則。接口就像高樓大廈中層
與層之間,戶(hù)與戶(hù)之間的防火墻;大船巨艦中的隔離艙。軟件的更新有時(shí)就像水火一樣難以預(yù)料和不可避免
(所以我們叫它軟件而不是硬件),而接口會(huì)適當(dāng)?shù)仄帘诬浖滤鶐?lái)的改動(dòng)擴(kuò)散(連鎖傳播)。通常,類(lèi)
的依賴(lài)性由這個(gè)原則和組合/繼承原則主導(dǎo),而不是由繼承主導(dǎo)。
LSP(Liskov Substitution Principle 里氏替換原則)
“老鼠的兒子會(huì)打洞”,子類(lèi)應(yīng)該具備父類(lèi)的特征。
ISP(Interface Segregation Principle 接口分隔原則)
盡量提供有針對(duì)性符合功能特點(diǎn)的簡(jiǎn)單接口,而不是包含很多方法的大而總接口。
接口分離原則是說(shuō),不相關(guān)的功能應(yīng)在不同的接口里。不然,在需要一個(gè)功能時(shí)也不得不同時(shí)也依賴(lài)于另一個(gè)
沒(méi)必要的功能。例如,在早期的 EJB 中,數(shù)據(jù)庫(kù)調(diào)用和遠(yuǎn)程調(diào)用混在一起,在不需要遠(yuǎn)程調(diào)用時(shí)恰好是最糟糕
的組合。這個(gè)原則說(shuō)的是,接口的依賴(lài)性寬度越窄越好。