第一章 走靈活軟件之路 —— 面向?qū)ο蟮牧笤瓌t
- 優(yōu)化代碼的第一步 —— 單一職責原則
單一職責原則的英文名稱為 Single Responsibility Principe熊咽,縮寫為 SRP矫付,定義是:就一個類而言阳准,應該就有一個引起它變化的原因。簡單來說屿愚,一個類中應該是一組相關(guān)性很高的函數(shù)、數(shù)據(jù)的封裝。
- 讓程序更穩(wěn)定裹纳、更靈活 —— 開閉原則
開閉原則的英文全稱是 Open Close Principe,縮寫為 OCP紧武,它是 Java 世界里最基礎的設計原則剃氧,它指導我們?nèi)绾谓⒁粋€穩(wěn)定的、靈活的系統(tǒng)阻星。其定義是:軟件中的對象(類朋鞍、模塊已添、函數(shù)等)應該對于擴展是開放的,但是滥酥,對于修改是封閉的更舞。
在軟件的生命周期內(nèi),因為變化坎吻、升級和維護等原因需要對軟件原有的代碼進行修改時缆蝉,可能會將錯誤引入原本已經(jīng)經(jīng)過測試的舊代碼中,破壞原有系統(tǒng)瘦真。因此刊头,當軟件需要變化時嘶窄,我們應該盡量通過擴展的方式來實現(xiàn)變化浦箱,而不是通過修改已有的代碼來實現(xiàn)作谭。當然嚣鄙,在現(xiàn)實開發(fā)中骇两,只通過繼承的方式來升級例嘱、維護原有系統(tǒng)只是一個理想化的愿景滔韵,在實際開發(fā)過程中肆捕,修改原有代碼际看、擴展代碼往往是同時存在的咸产。
- 構(gòu)建擴展性更好的系統(tǒng) —— 里氏替換原則
里氏替換原則英文全稱是 Liskov Substitution Principle,縮寫是 LSP仿村。LSP 的第一種定義是:如果對每一個類型為 S 的對象 O1锐朴,都有類型為 T 的對象 O2,使得以 T 定義的所有程序 P 在所有的對象 O1 都代換成 O2 時蔼囊,程序 P 的行為沒有發(fā)生變化焚志,那么類型 S 是類型 T 的子類型。上面的這種定義不太好理解畏鼓,里氏替換原則的第二種定義:所有引用基類的地方必須能夠透明地使用其子類的對象酱酬。面向?qū)ο蟮恼Z音的三大特點是繼承、封裝云矫、多態(tài)膳沽,里氏替換原則就是依賴于繼承、多態(tài)這兩大特性让禀。里氏替換原則簡單來說就是:只要父類能出現(xiàn)的地方子類就可以出現(xiàn)挑社,而且替換為子類也不會產(chǎn)生任何錯誤或者異常,使用者可能根本就不需要知道是父類還是子類巡揍。但是痛阻,反過來就不行了,有子類出現(xiàn)的地方腮敌,父類未必就能適應阱当∏卫總結(jié)起來就是兩個字:抽象。
里氏替換原則的核心原理是抽象弊添,抽象又依賴于繼承這個特性录淡,在 OOP 當中,繼承的優(yōu)缺點都相當明顯油坝,優(yōu)點有如下幾點:
(1)代碼重用嫉戚,減少創(chuàng)建類的成本,每個子類都擁有父類的方法和屬性免钻;
(2)子類與父類基本相似彼水,但又與父類有所區(qū)別;
(3)提高代碼的可擴展性极舔。
繼承的缺點:
(1)繼承是侵入性的,只要繼承就必須擁有父類的所有屬性和方法链瓦;
(2)可能造成子類代碼的冗余拆魏,靈活性降低,因為子類必須擁有父類的屬性和方法慈俯。
里氏替換原則提供了指導原則:也就是建立抽象渤刃,通過抽象建立規(guī)范,具體的實現(xiàn)在運行時替換掉抽象贴膘,保證系統(tǒng)的擴展性卖子、靈活性。開閉原則和里氏替換原則往往是生死相依刑峡、不離不棄的洋闽,通過里氏替換原則來達到對擴展開放,對修改關(guān)閉的效果突梦。然而诫舅,這兩個原則都同時強調(diào)了一個 OOP 的重要特性 —— 抽象,因此宫患,在開發(fā)過程中運用抽象是走向代碼優(yōu)化的重要一步刊懈。
- 讓項目擁有變化的能力 —— 依賴倒置原則
依賴倒置原則英文全稱是 Dependence Inversion Principle,縮寫是 DIP娃闲。依賴倒置原則指代了一種特定的解耦形式虚汛,使得高層次的模塊不依賴于低層次的模塊的實現(xiàn)細節(jié)的目的,依賴模塊被顛倒了皇帮。
依賴倒置原則的幾個關(guān)鍵點:
(1)高層模塊不應該依賴低層模塊卷哩,兩者都應該依賴其抽象;
(2)抽象不應該依賴細節(jié)玲献;
(3)細節(jié)應該依賴抽象殉疼。
在 Java 語言中梯浪,抽象就是指接口或者抽象類,兩者都是不能直接被實例化的瓢娜;細節(jié)就是實現(xiàn)類挂洛,實現(xiàn)接口或繼承抽象類而產(chǎn)生的類就是細節(jié),其特點是眠砾,可以直接被實例化虏劲。高層模塊就是調(diào)用端,低層模塊就是具體實現(xiàn)類褒颈。依賴倒置原則在 Java 語言中的表現(xiàn)就是:模塊間的依賴通過抽象發(fā)生柒巫,實現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的谷丸。一句話概況就是:面向接口編程堡掏,或者說是面向抽象編程,這里的抽象是指接口或抽象類刨疼。面向接口編程是面向?qū)ο缶柚蝗洌簿褪侵皬娬{(diào)的抽象。
- 系統(tǒng)有更高的靈活性 —— 接口隔離原則
接口隔離原則的英文全稱是 Interface Segregation Principles揩慕,縮寫是 ISP亭畜。ISP 的定義是:客戶端不應該依賴它不需要的接口。另一種定義是:類間的依賴關(guān)系應該建立在最小的接口上迎卤。接口隔離原則將非常龐大拴鸵、臃腫的接口拆分成更小的和更具體的接口,這樣客戶將會只需要知道他們感興趣的方法蜗搔。接口隔離原則的目的是系統(tǒng)解耦劲藐,從而容易重構(gòu)、更改和重新部署碍扔。接口隔離原則說白了就是瘩燥,讓客戶端依賴的接口盡可能地小。
- 更好的可擴展性 —— 迪米特原則
迪米特原則英文全稱為 Law of Demeter不同,縮寫是 LOD厉膀,也稱為最少知識原則(Least Knowledge Principle)。定義:一個對象應該對其他對象有最少的了解二拐。通俗地講服鹅,一個類應該對自己需要耦合或者調(diào)用的類知道得越少越好,類的內(nèi)部如何實現(xiàn)與調(diào)用者或者依賴者沒有關(guān)系百新,調(diào)用者或者依賴者只需要知道它需要的方法即可企软,其他的可一概不用考慮。類與類之間的關(guān)系越密切饭望,耦合度越大仗哨,當一個類發(fā)生改變時形庭,對另一個類的影響也越大。
迪米特原則還有一個英文解釋是 Only talk to your immedate friends厌漂,就是:只與直接的朋友通信萨醒。通過這簡單的幾個字就能夠?qū)⑽覀儚膹碗s的關(guān)系網(wǎng)中剝離出來,降低程序耦合度苇倡、提高穩(wěn)定性富纸。
本文內(nèi)容參考自《Android 源碼設計模式解析與實戰(zhàn)》