jackyhwei 發(fā)布于 2011-09-29 11:18 點(diǎn)擊:275次 | |
一、單一職責(zé)原則:英文名稱是Single Responsibility Principle,簡(jiǎn)稱SRP。有且只有一個(gè)原因引起類(lèi)的變更。There should never be more than one reason for a class to change. 例如在電話類(lèi)的設(shè)計(jì)中,接口包含三個(gè)方法:撥號(hào),通話和掛電話。但是這個(gè)接口包含了兩個(gè)職責(zé),撥號(hào)和掛電話屬于協(xié)議管理,通話屬于數(shù)據(jù)傳輸。不符合單一職 責(zé)原則??梢詫芴?hào)和掛電話作為一個(gè)接口,通話作為一個(gè)接口,一個(gè)類(lèi)實(shí)現(xiàn)了這兩個(gè)接口,把兩個(gè)職責(zé)融合在一個(gè)類(lèi)中,對(duì)外公布的是接口,而不是實(shí)現(xiàn)類(lèi)。 優(yōu)點(diǎn):類(lèi)的復(fù)雜度降低,提高了可讀性,可維護(hù)性,降低了變更引起的風(fēng)險(xiǎn)。 單一職責(zé)不僅適用于接口,類(lèi),還適用于方法,盡量使每個(gè)方法的職責(zé)清晰。 二、里氏替換原則:Functions that use pointers or references to base classes must beable to use objects of derived classes without knowing it. 所有引用基類(lèi)的地方必須透明地使用其子類(lèi)的對(duì)象。 通俗的講,只要父類(lèi)出現(xiàn)的地方,子類(lèi)都可以出現(xiàn),而且替換為子類(lèi)也不會(huì)發(fā)生任何異?;蝈e(cuò)誤,使用者根本不需要知道是子類(lèi)還是父類(lèi)。 包含四層含義: 子類(lèi)必須完全實(shí)現(xiàn)父類(lèi)的方法。 子類(lèi)可以有自己的方法。 覆蓋或?qū)崿F(xiàn)父類(lèi)的方法時(shí),輸入?yún)?shù)可以放大。例如父類(lèi)有一個(gè)的doSomething方法,其參數(shù)為(HashMap),而子類(lèi)中重載了這個(gè)方法, 參數(shù)為(Map),因?yàn)閰?shù)不一樣,所以不是覆寫(xiě),而是重載,此時(shí),當(dāng)子類(lèi)當(dāng)做父類(lèi)使用時(shí),傳入HashMap參數(shù),執(zhí)行的為父類(lèi)的方法。若反過(guò)來(lái),傳入 HashMap時(shí),執(zhí)行的是子類(lèi)的方法。(#add 此做法顯然是java伎倆,c++中禁止) 覆蓋或?qū)崿F(xiàn)父類(lèi)的方法時(shí),返回值要變小。 3和4條是為了保證版本升級(jí)時(shí)的兼容性,比如以前版本是創(chuàng)建了一個(gè)father類(lèi),新版本創(chuàng)建了子類(lèi),并使用子類(lèi),滿足上述兩條后可以實(shí)現(xiàn)系統(tǒng)兼容。傳遞不同的子類(lèi), 三、依賴倒置原則(Dependence Inversion Principle, DIP):High level modules should not depend upon low level modules. Bothshould depend upon abstractions. Abstractions should not depends upon details.Details should depend upon abstractions. 包含三層含義: 高層模塊不應(yīng)該依賴底層模塊,兩者都應(yīng)該依賴其抽象。 抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。 簡(jiǎn)單的說(shuō)就是面向接口編程(#add 基類(lèi)控制子類(lèi)的接口),模塊間的依賴是通過(guò)抽象發(fā)生的,實(shí)現(xiàn)類(lèi)之間不發(fā)生直接的依賴關(guān)系,其依賴是通過(guò)接口或者抽象類(lèi)發(fā)生的。 優(yōu)點(diǎn):依賴倒置原則可以減少類(lèi)間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低并行開(kāi)發(fā)引起的風(fēng)險(xiǎn),提高代碼的可讀性和可維護(hù)性。 實(shí)現(xiàn)類(lèi)不直接發(fā)生依賴關(guān)系,降低了耦合性,采用接口編程,由于調(diào)用的是接口,不必等實(shí)現(xiàn)類(lèi)完成,就可以對(duì)調(diào)用者進(jìn)行開(kāi)發(fā),測(cè)試。 例如在頂層模塊實(shí)現(xiàn)司機(jī)開(kāi)車(chē)功能,司機(jī)和車(chē)都屬于底層。在編寫(xiě)的過(guò)程中,要編寫(xiě)司機(jī)和車(chē)的接口,司機(jī)里調(diào)用車(chē)時(shí),調(diào)用的是接口,通過(guò)接口,構(gòu)造函數(shù) 或者SET方法給接口賦值。當(dāng)車(chē)模型改變時(shí),不需要修改底層的司機(jī)類(lèi)。符合了單一職責(zé),只有司機(jī)改變時(shí),才能引起司機(jī)類(lèi)的變化。 依賴的三種實(shí)現(xiàn)方法: 構(gòu)造函數(shù):上例中,建立司機(jī)類(lèi)的時(shí)候,通過(guò)構(gòu)造函數(shù)給司機(jī)類(lèi)中的車(chē)接口賦值。 SET方法:在司機(jī)類(lèi)中,增加一個(gè)PUBLIC 的SET方法,調(diào)用該方法時(shí),給司機(jī)類(lèi)中的車(chē)賦值。 接口方法:在調(diào)用的車(chē)的方法參數(shù)中,有一個(gè)參數(shù)為車(chē)的接口。 編程原則: 1.每個(gè)接口盡量有接口或者抽象類(lèi),或者抽象類(lèi)接口都有。 2.變量的表面類(lèi)型盡量是接口或者抽象類(lèi)。第1條和第2條不是必須的,比如編寫(xiě)工具類(lèi)XXXUtils時(shí)。 3.盡量不要覆寫(xiě)基類(lèi)的方法。類(lèi)間依賴的是抽象,覆寫(xiě)了抽象的方法,會(huì)對(duì)依賴的穩(wěn)定性造成一定的影響。 總結(jié):依賴倒置要求編程時(shí),面向抽象或者接口。這就要求子類(lèi)繼承時(shí),盡量不要新增方法,否則按照依賴倒置原則編程,根本訪問(wèn)不到子類(lèi)新增的方法。 四、接口隔離原則:Client should not beforced to depend upon interfaces that they don’t use. (客戶端不應(yīng)該依賴它不需要的接口。) The dependency of one class to another oneshould depend on the smallest possible interface. (類(lèi)間的依賴關(guān)系應(yīng)該建立在最小的接口上) 根據(jù)第一種定義,客戶端需要什么接口就提供什么接口,把不需要的接口剔掉,這就需要對(duì)接口進(jìn)行細(xì)化。 在第二種定義中,要求接口細(xì)化。 這兩種定義實(shí)質(zhì)上都是要求建立單一接口。 實(shí)例:比如星探查找美女,美女的定義是相貌美麗并且氣質(zhì)好。如果在一個(gè)接口里定義相貌美麗和氣質(zhì)好會(huì)造成接口臃腫,如果美女的標(biāo)準(zhǔn)變了,會(huì)對(duì)接口造成影響。這里應(yīng)該使美女實(shí)現(xiàn)相貌美麗和氣質(zhì)好兩個(gè)接口,這樣星探的抽象類(lèi)就依賴兩個(gè)接口,而不是一個(gè)臃腫的接口,靈活性增強(qiáng)。 接口是我們?cè)O(shè)計(jì)時(shí)對(duì)外提供的契約,通過(guò)分散定義多個(gè)接口,可以預(yù)防未來(lái)變更的擴(kuò)賽,提高系統(tǒng)的靈活性和可維護(hù)性。 接口設(shè)計(jì)原則 1.接口要盡量小。但是小是有限度的,不能違反單一職責(zé)原則,也就不能把一個(gè)職責(zé)拆分成兩個(gè)接口。 2.接口要高內(nèi)聚。高內(nèi)聚就是提高接口,類(lèi)和模塊的處理能力,減少對(duì)外的交互。接口要盡量少的公布public方法,接口是對(duì)外的承諾,承諾的越少,對(duì)系統(tǒng)開(kāi)發(fā)越有利,變更的風(fēng)險(xiǎn)就越少,同時(shí)有利于降低成本。 3.定制服務(wù)。定制服務(wù)就是單獨(dú)為一個(gè)個(gè)體提供優(yōu)良的服務(wù),我們?cè)谧鱿到y(tǒng)設(shè)計(jì)時(shí),也需要考慮系統(tǒng)之間或模塊之間的接口提供定制服務(wù)。這就要求接口只提供訪問(wèn)者需要的方法。(#add 其它的一律private) 4.接口設(shè)計(jì)是有限度的。接口設(shè)計(jì)粒度越小,系統(tǒng)越靈活,但是靈活的同時(shí)也會(huì)帶來(lái)結(jié)構(gòu)的復(fù)雜化,開(kāi)發(fā)難度增加,可維護(hù)性降低。 最佳實(shí)踐 一個(gè)接口只服務(wù)于一個(gè)子模塊或者業(yè)務(wù)邏輯 通過(guò)業(yè)務(wù)邏輯壓縮接口中的public方法。 被污染的接口盡量去修改,若修改的風(fēng)險(xiǎn)太大,則可以使用適配器模式進(jìn)行轉(zhuǎn)化處理, 五、迪米特原則(Law of Demeter, LoD)也叫最小知識(shí)原則(Least KnowledgePrinciple ,LKP):一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象有最少的了解,通俗的講,一個(gè)類(lèi)應(yīng)該對(duì)自己需要耦合或調(diào)用的類(lèi)知道得最少。 四層含義: 1.只和朋友交流。迪米特原則還有一個(gè)英文解釋是:Only talk to your immediate friends(只與直接的朋友通信)。例如,教師向班長(zhǎng)發(fā)送命令,數(shù)女生的個(gè)數(shù)。則教師中發(fā)送命令方法需要傳入班長(zhǎng)類(lèi),由班長(zhǎng)類(lèi)執(zhí)行數(shù)女生個(gè)數(shù)。在這中情況下,在教師類(lèi)中不應(yīng)該建立女生類(lèi),而應(yīng)該在班長(zhǎng)類(lèi)中建立女生類(lèi),對(duì)女生個(gè)數(shù)進(jìn)行統(tǒng)計(jì)。朋友類(lèi):出現(xiàn)在成員變量,或者輸入?yún)?shù)的類(lèi)稱為方法類(lèi),而出現(xiàn)在方法體內(nèi)部的類(lèi)不屬于朋友類(lèi)。因而在上例中,教師類(lèi)中不應(yīng)該出現(xiàn)女生類(lèi)。 2.朋友之間也是有距離的。例如在安裝軟件時(shí),通過(guò)向?qū)ь?lèi),第一步安裝成功可以安裝第二步,第二步安裝成功,可以執(zhí)行第三步。在這種情況下,向?qū)ь?lèi) 應(yīng)該對(duì)外提供一個(gè)安裝方法,此方法根據(jù)判斷條件調(diào)用三步安裝方法,實(shí)現(xiàn)了整個(gè)安裝過(guò)程。而不是讓用戶去調(diào)用每一步安裝方法,并根據(jù)安裝是否成功,決定下一 步安裝。在與MES集成的項(xiàng)目中,提供服務(wù)的方法類(lèi)很簡(jiǎn)單,其主要實(shí)現(xiàn)都是調(diào)用其他類(lèi)來(lái)實(shí)現(xiàn)的。 3.是自己的終究是自己的。在應(yīng)用中可能出現(xiàn)這樣一個(gè)方法,放在本類(lèi)中也可以,放在其他類(lèi)中葉可以。衡量準(zhǔn)則如下:如果一個(gè)方法放在本類(lèi)中,即不增加類(lèi)間關(guān)系,也不會(huì)對(duì)本類(lèi)產(chǎn)生負(fù)面影響,就放置在本類(lèi)中。當(dāng)然,如果該方法有多個(gè)類(lèi)調(diào)用,則可放入工具類(lèi)中。 4.慎用Serializable,如果在項(xiàng)目中,采用遠(yuǎn)程調(diào)用方法傳遞值對(duì)象,該對(duì)象就必須實(shí)現(xiàn)Serializable接口,也就是對(duì)網(wǎng)絡(luò)傳輸?shù)膶?duì)象進(jìn)行序列號(hào),否則會(huì)出現(xiàn)異常。 最佳實(shí)踐:迪米特法則的核心就是類(lèi)間解耦,弱耦合,只有解耦后,復(fù)用率才可以提高。但是這樣會(huì)導(dǎo)致產(chǎn)生大量的中轉(zhuǎn)類(lèi)或者跳轉(zhuǎn)類(lèi),導(dǎo)致系統(tǒng)的復(fù)雜性提高,同時(shí)也給維護(hù)帶來(lái)難度。在實(shí)際項(xiàng)目中,一個(gè)類(lèi)跳轉(zhuǎn)兩次才能訪問(wèn)到另個(gè)一個(gè)類(lèi),就需要進(jìn)行重構(gòu)了。 六、開(kāi)閉原則:Software entities like classes,modules and functions should be open for extension but close for modifications.(一個(gè)軟件實(shí)體如類(lèi),模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉)開(kāi)閉原則要求盡量通過(guò)擴(kuò)展軟件實(shí)體的方法來(lái)適應(yīng)變化,而不是通過(guò)修改已有的代碼來(lái)完成變化。它是為軟件實(shí)體的未來(lái)而制定的對(duì)現(xiàn)行開(kāi)發(fā)設(shè)計(jì)進(jìn)行約束的一個(gè)原則。 簡(jiǎn)單例子:以圖書(shū)銷(xiāo)售為例,圖書(shū)有三個(gè)屬性,價(jià)格,書(shū)名以及作者。小說(shuō)書(shū)繼承了圖書(shū)接口。如果有一天圖小說(shuō)書(shū)打折,修改方案有三種: (1)修改圖書(shū)接口,在接口中增加獲得打折價(jià)格方法。缺點(diǎn)是所有實(shí)現(xiàn)圖書(shū)的接口都需要增加這種方法。 (2)直接修改小說(shuō)類(lèi)中獲得價(jià)格的方法。缺點(diǎn)是:無(wú)論誰(shuí)都看不到小說(shuō)書(shū)的原價(jià)。 (3)新寫(xiě)一個(gè)打折小說(shuō)類(lèi),繼承小說(shuō)類(lèi),覆寫(xiě)其中的價(jià)格方法。銷(xiāo)售時(shí),將打折小說(shuō)類(lèi)賦給圖書(shū)接口。采購(gòu)人員查看價(jià)格時(shí),可以通過(guò)常見(jiàn)小說(shuō)類(lèi)實(shí)現(xiàn)。 變化分類(lèi):我們把變化分為三種。 (1)邏輯變化 只變化一個(gè)邏輯,不涉及其它模塊??梢酝ㄟ^(guò)修改類(lèi)中的方法來(lái)完成。前提條件是所有依賴或者關(guān)聯(lián)的類(lèi)都按照相同的邏輯處理。 (2)子模塊變化 一個(gè)子模塊變化,會(huì)引起高層的變化。因此通過(guò)擴(kuò)展完成變化時(shí),高層次的模塊修改也是必然的。 (3)可見(jiàn)視圖的變化 如何應(yīng)用開(kāi)閉原則: (1)抽象約束 通過(guò)接口或者抽象類(lèi)可以約束一組可能變化的行為,并且能夠?qū)崿F(xiàn)對(duì)擴(kuò)展開(kāi)放。包含三層和含義:第一,通過(guò)接口和抽象類(lèi)約束擴(kuò)展,多擴(kuò)展進(jìn)行邊界限定,不允許 出現(xiàn)在接口或者抽象中不存在的接口。第二,參數(shù)類(lèi)型,引用對(duì)象盡量使用接口或者抽象類(lèi),而不是顯現(xiàn)類(lèi)第三,抽象層盡量保持穩(wěn)定,一旦確定即不允許修改。如 果因業(yè)務(wù)需要增加新的功能,可以寫(xiě)一個(gè)繼承原有接口的接口。 (2)通過(guò)元數(shù)據(jù)控制模塊行為 元數(shù)據(jù)用來(lái)描述環(huán)境和數(shù)據(jù)的數(shù)據(jù),通俗的說(shuō)就是配置參數(shù),參數(shù)可以從文件中獲得或者數(shù)據(jù)庫(kù)中獲得。 (3)封裝變化 預(yù)測(cè)將來(lái)可能出現(xiàn)的變化,將相同的變化封裝到一個(gè)接口或者抽象類(lèi)中,將不同的變化封裝到不同的接口后者抽象類(lèi)中。 要把軟件做得非常靈活又要便于維護(hù)是一個(gè)很困難的事情。靈活的軟件他的結(jié)構(gòu)就復(fù)雜,維護(hù)起來(lái)就困難。有得必有失,關(guān)鍵就在于如何處理這兩者,使得大于失。軟件的設(shè)計(jì)開(kāi)發(fā)應(yīng)遵循以下六大原則: 1.OCP 全稱:“Open-Closed Principle” 開(kāi)放-封閉原則 說(shuō)明:對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。 優(yōu)點(diǎn):按照OCP原則設(shè)計(jì)出來(lái)的系統(tǒng),降低了程序各部分之間的耦合性,其適應(yīng)性、靈活性、穩(wěn)定性都比較好。當(dāng)已 有軟件系統(tǒng)需要增加新的功能時(shí),不需要對(duì)作為系統(tǒng)基礎(chǔ)的抽象層進(jìn)行修改,只需要在原有基礎(chǔ)上附加新的模塊就能實(shí)現(xiàn)所需要添加的功能。增加的新模塊對(duì)原有的 模塊完全沒(méi)有影響或影響很小,這樣就無(wú)須為原有模塊進(jìn)行重新測(cè)試。 如何實(shí)現(xiàn)“開(kāi)-閉”原則 在面向?qū)ο笤O(shè)計(jì)中,不允許更改的是系統(tǒng)的抽象層,而允許擴(kuò)展的是系統(tǒng)的實(shí)現(xiàn)層。換言之,定義一個(gè)一勞永逸的抽象設(shè)計(jì)層,允許盡可能多的行為在實(shí)現(xiàn)層被實(shí)現(xiàn)。 解決問(wèn)題關(guān)鍵在于抽象化,抽象化是面向?qū)ο笤O(shè)計(jì)的第一個(gè)核心本質(zhì)。 對(duì)一個(gè)事物抽象化,實(shí)質(zhì)上是在概括歸納總結(jié)它的本質(zhì)。抽象讓我們抓住最最重要的東西,從更高一層去思考。這降低了思考的復(fù)雜度,我們不用同時(shí)考慮那么多的東西。換言之,我們封裝了事物的本質(zhì),看不到任何細(xì)節(jié)。 在面向?qū)ο缶幊讨?,通過(guò)抽象類(lèi)及接口,規(guī)定了具體類(lèi)的特征作為抽象層,相對(duì)穩(wěn)定,不需更改,從而滿足“對(duì)修改關(guān)閉”;而從抽象類(lèi)導(dǎo)出的具體類(lèi)可以改變系統(tǒng)的行為,從而滿足“對(duì)擴(kuò)展開(kāi)放”。 對(duì)實(shí)體進(jìn)行擴(kuò)展時(shí),不必改動(dòng)軟件的源代碼或者二進(jìn)制代碼。關(guān)鍵在于抽象。 2. LSP 全稱:“Liskov Substitution Principle” 里氏代換原則 說(shuō)明:子類(lèi)型必須能夠替換它們的基類(lèi)型。一個(gè)軟件實(shí)體如果使用的是一個(gè)基類(lèi),那么當(dāng)把這個(gè)基類(lèi)替換成繼承該基類(lèi)的子類(lèi),程序的行為不會(huì)發(fā)生任何變化。軟件實(shí)體察覺(jué)不出基類(lèi)對(duì)象和子類(lèi)對(duì)象的區(qū)別。 優(yōu)點(diǎn):可以很容易的實(shí)現(xiàn)同一父類(lèi)下各個(gè)子類(lèi)的互換,而客戶端可以毫不察覺(jué)。 3. DIP 全稱:“Dependence Inversion Principle”依賴倒置原則 說(shuō)明:要依賴于抽象,不要依賴于具體。客戶端依賴于抽象耦合。 抽象不應(yīng)當(dāng)依賴于細(xì)節(jié);細(xì)節(jié)應(yīng)當(dāng)依賴于抽象; 要針對(duì)接口編程,不針對(duì)實(shí)現(xiàn)編程。 優(yōu)點(diǎn):使用傳統(tǒng)過(guò)程化程序設(shè)計(jì)所創(chuàng)建的依賴關(guān)系,策略依賴于細(xì)節(jié),這是糟糕的,因?yàn)椴呗允艿郊?xì)節(jié)改變的影響。依賴倒置原則使細(xì)節(jié)和策略都依賴于抽象,抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性。 怎樣做到依賴倒置? 以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。抽象耦合關(guān)系總要涉及具體類(lèi)從抽象類(lèi)繼承,并且需要保證在任何引用到基類(lèi)的地方都可以改換成其子類(lèi),因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。 在抽象層次上的耦合雖然有靈活性,但也帶來(lái)了額外的復(fù)雜性,如果一個(gè)具體類(lèi)發(fā)生變化的可能性非常小,那么抽象耦合能發(fā)揮的好處便十分有限,這時(shí)可以用具體耦合反而會(huì)更好。 層次化:所有結(jié)構(gòu)良好的面向?qū)ο髽?gòu)架都具有清晰的層次定義,每個(gè)層次通過(guò)一個(gè)定義良好的、受控的接口向外提供一組內(nèi)聚的服務(wù)。 依賴于抽象:建議不依賴于具體類(lèi),即程序中所有的依賴關(guān)系都應(yīng)該終止于抽象類(lèi)或者接口。盡量做到: 1、任何變量都不應(yīng)該持有一個(gè)指向具體類(lèi)的指針或者引用。 2、任何類(lèi)都不應(yīng)該從具體類(lèi)派生。 3、任何方法都不應(yīng)該覆寫(xiě)它的任何基類(lèi)中的已經(jīng)實(shí)現(xiàn)的方法。 4. ISP 全稱:“Interface Segregation Principle” 接口隔離原則 說(shuō)明:使用多個(gè)專(zhuān)一功能的接口比使用一個(gè)的總接口總要好。從一個(gè)客戶類(lèi)的角度來(lái)講:一個(gè)類(lèi)對(duì)另外一個(gè)類(lèi)的依賴性應(yīng)當(dāng)是建立在最小接口上的。過(guò)于臃腫的接口是對(duì)接口的污染,不應(yīng)該強(qiáng)迫客戶依賴于它們不用的方法。 優(yōu)點(diǎn):會(huì)使一個(gè)軟件系統(tǒng)功能擴(kuò)展時(shí),修改的壓力不會(huì)傳到別的對(duì)象那里。 如何實(shí)現(xiàn)接口隔離原則 不應(yīng)該強(qiáng)迫用戶依賴于他們不用的方法。 1、利用委托分離接口。 2、利用多繼承分離接口。 5. CARP or CRP 全稱:“Composite/AggregateReuse Principle” 合成/聚合復(fù)用原則 or “Composite Reuse Principle” 合成復(fù)用原則 說(shuō)明:如果新對(duì)象的某些功能在別的已經(jīng)創(chuàng)建好的對(duì)象里面已經(jīng)實(shí)現(xiàn),那么盡量使用別的對(duì)象提供的功能,使之成為新對(duì)象的一部分,而不要自己再重新創(chuàng)建。新對(duì)象通過(guò)向這些對(duì)象的委派達(dá)到復(fù)用已有功能的。 簡(jiǎn)而言之,要盡量使用合成/聚合,盡量不要使用繼承。 優(yōu)點(diǎn): 1) 新對(duì)象存取成分對(duì)象的唯一方法是通過(guò)成分對(duì)象的接口。 2) 這種復(fù)用是黑箱復(fù)用,因?yàn)槌煞謱?duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象所看不見(jiàn)的。 3) 這種復(fù)用支持包裝。 4) 這種復(fù)用所需的依賴較少。 5) 每一個(gè)新的類(lèi)可以將焦點(diǎn)集中在一個(gè)任務(wù)上。 6) 這種復(fù)用可以在運(yùn)行時(shí)間內(nèi)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)的引用與成分對(duì)象類(lèi)型相同的對(duì)象。 7) 作為復(fù)用手段可以應(yīng)用到幾乎任何環(huán)境中去。 缺點(diǎn): 就是系統(tǒng)中會(huì)有較多的對(duì)象需要管理。 6. LOD or LKP 全稱:“Law of Demeter” 迪米特原則 or “Least Knowledge Principle” 最少知識(shí)原則 說(shuō)明:對(duì)象與對(duì)象之間應(yīng)該使用盡可能少的方法來(lái)關(guān)聯(lián),避免千絲萬(wàn)縷的關(guān)系。 如何實(shí)現(xiàn)迪米特法則 迪米特法則的主要用意是控制信息的過(guò)載,在將其運(yùn)用到系統(tǒng)設(shè)計(jì)中應(yīng)注意以下幾點(diǎn): 1) 在類(lèi)的劃分上,應(yīng)當(dāng)創(chuàng)建有弱耦合的類(lèi)。類(lèi)之間的耦合越弱,就越有利于復(fù)用。 2) 在類(lèi)的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類(lèi)都應(yīng)當(dāng)盡量降低成員的訪問(wèn)權(quán)限。一個(gè)類(lèi)不應(yīng)當(dāng)public自己的屬性,而應(yīng)當(dāng)提供取值和賦值的方法讓外界間接訪問(wèn)自己的屬性。 3) 在類(lèi)的設(shè)計(jì)上,只要有可能,一個(gè)類(lèi)應(yīng)當(dāng)設(shè)計(jì)成不變類(lèi)。 4) 在對(duì)其它對(duì)象的引用上,一個(gè)類(lèi)對(duì)其它對(duì)象的引用應(yīng)該降到最低。 SRP簡(jiǎn)介(SRP--Single-Responsibility Principle): 就一個(gè)類(lèi)而言,應(yīng)該只專(zhuān)注于做一件事和僅有一個(gè)引起它變化的原因。 所謂職責(zé),我們可以理解他為功能,就是設(shè)計(jì)的這個(gè)類(lèi)功能應(yīng)該只有一個(gè),而不是兩個(gè)或更多。也可以理解為引用變化的原因,當(dāng)你發(fā)現(xiàn)有兩個(gè)變化會(huì)要求我們修改這個(gè)類(lèi),那么你就要考慮撤分這個(gè)類(lèi)了。因?yàn)槁氊?zé)是變化的一個(gè)軸線,當(dāng)需求變化時(shí),該變化會(huì)反映類(lèi)的職責(zé)的變化。 使用SRP注意點(diǎn): 1、一個(gè)合理的類(lèi),應(yīng)該僅有一個(gè)引起它變化的原因,即單一職責(zé); SRP優(yōu)點(diǎn): 消除耦合,減小因需求變化引起代碼僵化性臭味 (weiqubo) |