設(shè)計(jì)原則(一)
一. 單一職責(zé)原則(Single Responsibility Principle)
????? 定義:應(yīng)該有且只有一個(gè)引起類變更的原因=>一個(gè)類,只能做一件事
????? 好處:
????????1. 提高了代碼的可讀性,提高系統(tǒng)的可維護(hù)性
????????2. 降低類的復(fù)雜度,一個(gè)模塊只負(fù)責(zé)一個(gè)職責(zé),提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性
????????3. 降低類變更引起的風(fēng)險(xiǎn),變更是必然的,如果單一職責(zé)做的好,當(dāng)修改一個(gè)功能的時(shí)候可以顯著的降低對(duì)另一個(gè)功能的影響
二. 開(kāi)放封閉原則(Open Closed Principle)
????○ 開(kāi)放封閉原則是面向?qū)ο笏性瓌t的核心
????○ 對(duì)功能開(kāi)放,面向修改代碼封閉
????○ 需求改變時(shí),在不改變軟件實(shí)體源代碼(類、接口、方法等)的前提下,通過(guò)擴(kuò)展功能,使其滿足新的需求
????○ 面向抽象編程:使用抽象,封裝變化
三. 依賴倒置原則(Dependency Inversion Principle)
????○ 開(kāi)放封閉原則是面向?qū)ο笤O(shè)計(jì)的終極目標(biāo),而依賴倒置原則 是實(shí)現(xiàn)開(kāi)放封閉原則的基礎(chǔ)
????1. 高層模塊(調(diào)用者)不應(yīng)該依賴于低層模塊(被調(diào)用者),兩個(gè)都應(yīng)該依賴于抽象
????2. 抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象
????3. 依賴倒置原則的本質(zhì)就是通過(guò)抽象(接口或抽象類)使各個(gè)類或模塊的實(shí)現(xiàn)彼此獨(dú)立,互不影響,實(shí)現(xiàn)模塊間的松耦合
????○ 面向接口編程,不要面向?qū)崿F(xiàn)編程
4. 關(guān)于依賴
????i. 一個(gè)優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計(jì),核心原則之一就是將變化【隔離】/【封裝】
????ii. 為了實(shí)現(xiàn)這個(gè)目的,需要面向接口編程,使用后,客戶類,不再直接依賴于服務(wù)類,而是依賴一個(gè)抽象的接口,這樣,客戶類就不能在內(nèi)部直接實(shí)例化服務(wù)類
????iii. 但是在客戶類運(yùn)行的過(guò)程中,又需要具體的服務(wù)類來(lái)提供服務(wù),因?yàn)榻涌谑遣荒鼙粚?shí)例化的,就產(chǎn)生了一個(gè)矛盾:客戶類不允許實(shí)例化服務(wù)類,但是客戶類又需要服務(wù)類的服務(wù)
????iv. 為了解決這個(gè)矛盾,我們?cè)O(shè)計(jì)了一種解決方案,即:客戶類定義一個(gè)注入點(diǎn),用于服務(wù)類的注入,而客戶類的客戶類(Program類),負(fù)責(zé)根據(jù)具體情況,實(shí)例化服務(wù)類,注入到客戶類中,從而解決了這個(gè)矛盾
5. 依賴注入的方式
????i. 通過(guò)接口傳遞(接口注入)
????ii. 通過(guò)構(gòu)造函數(shù)傳遞
????iii. 通過(guò)屬性的set方法傳遞
四. 里氏替換原則(Liskov Substitution principle)
????○ 所有引用父類對(duì)象的地方,都可以使用其子類代替
????○?如果父類中裝的是子類對(duì)象,那么可以將這個(gè)父類強(qiáng)制轉(zhuǎn)換為子類對(duì)象
五. 接口隔離原則(Interface Segragation Principle)——設(shè)計(jì)接口時(shí)采用的指導(dǎo)思想
????1. 客戶端不應(yīng)該依賴它不需要的接口
????2. 一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小接口上
????3. 接口盡量細(xì)分,不要在一個(gè)接口中放很多方法
????4. 接口隔離原則和單一職責(zé)原則的關(guān)系
????????§ 單一職責(zé):一個(gè)類干一件事? //影響類變化的原因只有一個(gè)? ? ? 高內(nèi)聚(模塊內(nèi)部元素的相似程度高)
????????§ 接口隔離:// 低耦合? 模塊之間的依賴程度較低
????5. 根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)原則
六. 迪米特原則(Law of Demeter)(最小知識(shí)原則(The Least Knowledge Principle))——設(shè)計(jì)類的時(shí)候采用的指導(dǎo)思想
????1. 要求一個(gè)對(duì)象應(yīng)該對(duì)其它對(duì)象有最少的了解(最小知識(shí)原則)
????2. 降低類之間的耦合
????3. 迪米特原則實(shí)際上就是一個(gè)類在創(chuàng)建方法和屬性時(shí)要遵守的法則
????4. 只和直接朋友通信!
????i. 成員對(duì)象
????ii. 方法參數(shù)
????iii. 方法返回值
????iv. 注意:出現(xiàn)在局部變量中的類,不是直接朋友
七. 合成復(fù)用原則(Composite Reuse Principle)
????○ 合成復(fù)用原則,又稱組合/聚合復(fù)用原則
????○ 盡量使用對(duì)象組合,而不是繼承來(lái)達(dá)到復(fù)用
????○ 合成復(fù)用原則是將已有的對(duì)象納入到新對(duì)象中,作為新對(duì)象的對(duì)象成員來(lái)實(shí)現(xiàn)的,新對(duì)象可以調(diào)用已有對(duì)象的功能,從而達(dá)到復(fù)用
????○ 繼承的“bug”
????????§ 破壞了系統(tǒng)的封裝性,基類如果發(fā)生了改變,子類的實(shí)現(xiàn)也會(huì)發(fā)生改變
????????§ 子類如果不需要父類中新添加的方法,則系統(tǒng)耦合度會(huì)變高
????????§ 繼承是靜態(tài)的,不能在程序運(yùn)行時(shí)發(fā)生改變
????○ has-a關(guān)系 使用合成復(fù)用
????○ is-a關(guān)系? ? 使用繼承