版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第2章面向?qū)ο笤O(shè)計原則本章教學(xué)內(nèi)容w 面向?qū)ο笤O(shè)計原則概述w 單一職責(zé)原則w 開閉原則w 里氏代換原則w 依賴倒轉(zhuǎn)原則w 接口隔離原則w 合成復(fù)用原則w 迪米特法則面向?qū)ο笤O(shè)計原則概述w 軟件的可維護(hù)性和可復(fù)用性 知名軟件大師知名軟件大師Robert C.Martin認(rèn)為一個可維護(hù)性認(rèn)為一個可維護(hù)性(Maintainability) 較低的軟件設(shè)計,通常由于如下較低的軟件設(shè)計,通常由于如下4個原因造成:個原因造成: 過于僵硬(Rigidity) 過于脆弱(Fragility) 復(fù)用率低(Immobility) 黏度過高(Viscosity) Robert C.Martin面向?qū)ο笤O(shè)計原則概述w
2、 軟件的可維護(hù)性和可復(fù)用性軟件工程和建模大師軟件工程和建模大師Peter Coad認(rèn)為,一個好的系統(tǒng)認(rèn)為,一個好的系統(tǒng)設(shè)計應(yīng)該具備如下三個性質(zhì):設(shè)計應(yīng)該具備如下三個性質(zhì): 可擴(kuò)展性(Extensibility) 靈活性(Flexibility) 可插入性(Pluggability) Peter Coad面向?qū)ο笤O(shè)計原則概述w 軟件的可維護(hù)性和可復(fù)用性 軟件的復(fù)用軟件的復(fù)用(Reuse)或重用或重用擁有眾多優(yōu)點,如可以提高軟件擁有眾多優(yōu)點,如可以提高軟件的開發(fā)效率,提高軟件質(zhì)量,節(jié)約開發(fā)成本,的開發(fā)效率,提高軟件質(zhì)量,節(jié)約開發(fā)成本,恰當(dāng)?shù)膹?fù)用還恰當(dāng)?shù)膹?fù)用還可以改善系統(tǒng)的可維護(hù)性可以改善系統(tǒng)的可維
3、護(hù)性。 面向?qū)ο笤O(shè)計復(fù)用的目標(biāo)在于面向?qū)ο笤O(shè)計復(fù)用的目標(biāo)在于實現(xiàn)支持可維護(hù)性的復(fù)用。實現(xiàn)支持可維護(hù)性的復(fù)用。 在面向?qū)ο蟮脑O(shè)計里面,在面向?qū)ο蟮脑O(shè)計里面,可維護(hù)性復(fù)用都是以面向?qū)ο笤O(shè)計可維護(hù)性復(fù)用都是以面向?qū)ο笤O(shè)計原則為基礎(chǔ)的原則為基礎(chǔ)的,這些設(shè)計原則首先都是復(fù)用的原則,遵循這,這些設(shè)計原則首先都是復(fù)用的原則,遵循這些設(shè)計原則可以有效地提高系統(tǒng)的復(fù)用性,同時提高系統(tǒng)的些設(shè)計原則可以有效地提高系統(tǒng)的復(fù)用性,同時提高系統(tǒng)的可維護(hù)性??删S護(hù)性。 面向?qū)ο笤O(shè)計原則概述w 軟件的可維護(hù)性和可復(fù)用性 傳統(tǒng)的復(fù)用傳統(tǒng)的復(fù)用 代碼的復(fù)制代碼的復(fù)制 算法的復(fù)用算法的復(fù)用 數(shù)據(jù)結(jié)構(gòu)的復(fù)用數(shù)據(jù)結(jié)構(gòu)的復(fù)用 面向?qū)ο笤O(shè)
4、計的復(fù)用面向?qū)ο笤O(shè)計的復(fù)用 抽象化和繼承使得概念和定義可以復(fù)用,多態(tài)使得實現(xiàn)和抽象化和繼承使得概念和定義可以復(fù)用,多態(tài)使得實現(xiàn)和應(yīng)用可以復(fù)用,而抽象化和封裝可以保持和促進(jìn)系統(tǒng)的可維應(yīng)用可以復(fù)用,而抽象化和封裝可以保持和促進(jìn)系統(tǒng)的可維護(hù)性。護(hù)性。 面向?qū)ο笤O(shè)計原則概述w 軟件的可維護(hù)性和可復(fù)用性面向?qū)ο笤O(shè)計原則和設(shè)計模式也是對系統(tǒng)進(jìn)行合理重構(gòu)面向?qū)ο笤O(shè)計原則和設(shè)計模式也是對系統(tǒng)進(jìn)行合理重構(gòu)的指南針,的指南針,重構(gòu)重構(gòu)(Refactoring)是是在不改變軟件現(xiàn)有功在不改變軟件現(xiàn)有功能的基礎(chǔ)上,通過調(diào)整程序代碼改善軟件的質(zhì)量、性能,能的基礎(chǔ)上,通過調(diào)整程序代碼改善軟件的質(zhì)量、性能,使其程序的設(shè)計模
5、式和架構(gòu)更趨合理,提高軟件的擴(kuò)展使其程序的設(shè)計模式和架構(gòu)更趨合理,提高軟件的擴(kuò)展性和維護(hù)性性和維護(hù)性。 Martin Fowler面向?qū)ο笤O(shè)計原則概述w 面向?qū)ο笤O(shè)計原則簡介 常用的面向?qū)ο笤O(shè)計原則包括常用的面向?qū)ο笤O(shè)計原則包括7個,這些原則并不是孤立存在的,它們相個,這些原則并不是孤立存在的,它們相互依賴,相互補充?;ヒ蕾?,相互補充。設(shè)計原則名稱設(shè)計原則名稱設(shè)計原則簡介設(shè)計原則簡介重要性重要性單一職責(zé)原則(Single Responsibility Principle, SRP)類的職責(zé)要單一,不能將太多的職責(zé)放在一個類中開閉原則(Open-Closed Principle, OCP)軟件實
6、體對擴(kuò)展是開放的,但對修改是關(guān)閉的,即在不修改一個軟件實體的基礎(chǔ)上去擴(kuò)展其功能里氏代換原則(Liskov Substitution Principle, LSP)在軟件系統(tǒng)中,一個可以接受基類對象的地方必然可以接受一個子類對象依賴倒轉(zhuǎn)原則(Dependency Inversion Principle, DIP)要針對抽象層編程,而不要針對具體類編程接口隔離原則(Interface Segregation Principle, ISP)使用多個專門的接口來取代一個統(tǒng)一的接口 合成復(fù)用原則(Composite Reuse Principle, CRP)在系統(tǒng)中應(yīng)該盡量多使用組合和聚合關(guān)聯(lián)關(guān)系,盡量
7、少使用甚至不使用繼承關(guān)系迪米特法則(Law of Demeter, LoD)一個軟件實體對其他實體的引用越少越好,或者說如果兩個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用,而是通過引入一個第三者發(fā)生間接交互單一職責(zé)原則 w 單一職責(zé)原則定義 單一職責(zé)原則單一職責(zé)原則(Single Responsibility Principle, SRP)定義如下:定義如下: 一個對象應(yīng)該只包含單一的職責(zé),并且該職責(zé)被完整地封裝在一個類中。 其英文定義為:其英文定義為: Every object should have a single responsibility, and that res
8、ponsibility should be entirely encapsulated by the class. 另一種定義方式如下:另一種定義方式如下: 就一個類而言,應(yīng)該僅有一個引起它變化的原因。 其英文定義為:其英文定義為: There should never be more than one reason for a class to change.單一職責(zé)原則 w 單一職責(zé)原則分析 一個類(或者大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的一個類(或者大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的可能性越小可能性越小,而且如果一個類承擔(dān)的職責(zé)過多,就相當(dāng)于將這些職,而且如果一個類
9、承擔(dān)的職責(zé)過多,就相當(dāng)于將這些職責(zé)耦合在一起,當(dāng)其中一個職責(zé)變化時,可能會影響其他職責(zé)的運責(zé)耦合在一起,當(dāng)其中一個職責(zé)變化時,可能會影響其他職責(zé)的運作。作。 類的職責(zé)主要包括兩個方面:類的職責(zé)主要包括兩個方面:數(shù)據(jù)職責(zé)和行為職責(zé)數(shù)據(jù)職責(zé)和行為職責(zé),數(shù)據(jù)職責(zé)通過數(shù)據(jù)職責(zé)通過其屬性來體現(xiàn)其屬性來體現(xiàn),而,而行為職責(zé)通過其方法來體現(xiàn)行為職責(zé)通過其方法來體現(xiàn)。 單一職責(zé)原則是實現(xiàn)單一職責(zé)原則是實現(xiàn)高內(nèi)聚、低耦合高內(nèi)聚、低耦合的指導(dǎo)方針,在很多代碼重構(gòu)的指導(dǎo)方針,在很多代碼重構(gòu)手法中都能找到它的存在,它是最簡單但又最難運用的原則,需要手法中都能找到它的存在,它是最簡單但又最難運用的原則,需要設(shè)計人員發(fā)現(xiàn)
10、類的不同職責(zé)并將其分離,而發(fā)現(xiàn)類的多重職責(zé)需要設(shè)計人員發(fā)現(xiàn)類的不同職責(zé)并將其分離,而發(fā)現(xiàn)類的多重職責(zé)需要設(shè)計人員具有較強(qiáng)的分析設(shè)計能力和相關(guān)重構(gòu)經(jīng)驗。設(shè)計人員具有較強(qiáng)的分析設(shè)計能力和相關(guān)重構(gòu)經(jīng)驗。單一職責(zé)原則 w 單一職責(zé)原則實例 實例說明實例說明 某基于Java的C/S系統(tǒng)的“登錄功能”通過如下登錄類(Login)實現(xiàn): 現(xiàn)使用單一職責(zé)原則對其進(jìn)行重構(gòu)。單一職責(zé)原則 w 單一職責(zé)原則實例 實例解析實例解析 開閉原則w 開閉原則定義 開閉原則開閉原則(Open-Closed Principle, OCP)定義如下:定義如下: 一個軟件實體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。也就是說在設(shè)計一個模塊的時候
11、,應(yīng)當(dāng)使這個模塊可以在不被修改的前提下被擴(kuò)展,即實現(xiàn)在不修改源代碼的情況下改變這個模塊的行為。其英文定義為:其英文定義為: Software entities should be open for extension, but closed for modification.開閉原則w 開閉原則分析 開閉原則由開閉原則由Bertrand Meyer于于1988年提出,它是面向年提出,它是面向?qū)ο笤O(shè)計中最重要的原則之一。對象設(shè)計中最重要的原則之一。在開閉原則的定義中,在開閉原則的定義中,軟件實體可以指一個軟件模塊、軟件實體可以指一個軟件模塊、一個由多個類組成的局部結(jié)構(gòu)或一個獨立的類一個由多個類組
12、成的局部結(jié)構(gòu)或一個獨立的類。開閉原則w 開閉原則分析 抽象化抽象化是開閉原則的關(guān)鍵。是開閉原則的關(guān)鍵。 開閉原則還可以通過一個更加具體的開閉原則還可以通過一個更加具體的“對可變性封對可變性封裝原則裝原則”來描述,對可變性封裝原則來描述,對可變性封裝原則(Principle of Encapsulation of Variation, EVP)要求找到系統(tǒng)要求找到系統(tǒng)的可變因素并將其封裝起來。的可變因素并將其封裝起來。 開閉原則w 開閉原則實例 實例說明實例說明 某圖形界面系統(tǒng)提供了各種不同形狀的按鈕,客戶端代碼可針對這些按鈕進(jìn)行編程,用戶可能會改變需求要求使用不同的按鈕,原始設(shè)計方案如圖所示:
13、 現(xiàn)對該系統(tǒng)進(jìn)行重構(gòu),使之滿足開閉原則的要求。LoginForm- button : CircleButton+ display () : voidCircleButton+ view () : voidLoginForm- button : RectangleButton+ display () : voidRectangleButton+ view () : void開閉原則w 開閉原則實例 實例解析實例解析 里氏代換原則 w 里氏代換原則定義 里氏代換原則里氏代換原則(Liskov Substitution Principle, LSP)有兩種定義方式,有兩種定義方式,第一種定義方式相對
14、嚴(yán)格,其定義如下:第一種定義方式相對嚴(yán)格,其定義如下: 如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象o1都代換成o2時,程序P的行為沒有變化,那么類型S是類型T的子類型。 其英文定義為:其英文定義為: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o
15、2 then S is a subtype of T. 第二種更容易理解的定義方式如下:第二種更容易理解的定義方式如下: 所有引用基類(父類)的地方必須能透明地使用其子類的對象。 其英文定義為:其英文定義為: Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.里氏代換原則 w 里氏代換原則分析 里氏代換原則由里氏代換原則由2008年圖靈獎得主、美國第一位計算機(jī)科學(xué)女博士、麻年圖靈獎得主、美國第一位計
16、算機(jī)科學(xué)女博士、麻省理工學(xué)院教授省理工學(xué)院教授Barbara Liskov和卡內(nèi)基和卡內(nèi)基.梅隆大學(xué)梅隆大學(xué)Jeannette Wing教教授于授于1994年提出。其原文如下:年提出。其原文如下:Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T. 芭芭拉芭芭拉利斯科夫(利斯科夫(Barbara Liskov),美國計算機(jī)科學(xué)家,2008年圖靈獎得主,2004年約翰.馮諾依曼獎得主
17、,美國工程院院士,美國藝術(shù)與科學(xué)院院士,美國計算機(jī)協(xié)會會士?,F(xiàn)任麻省理工學(xué)院電子電氣與計算機(jī)科學(xué)系教授。她是美國第一個計算機(jī)科學(xué)女博士。周以真(周以真(Jeannette M. Wing),美國計算機(jī)科學(xué)家,卡內(nèi)基.梅隆大學(xué)教授,美國國家自然基金會計算與信息科學(xué)工程部助理部長,ACM和IEEE會士。里氏代換原則 w 里氏代換原則分析里氏代換原則可以通俗表述為:在里氏代換原則可以通俗表述為:在軟件中如果能夠使用軟件中如果能夠使用基類對象,那么一定能夠使用其子類對象基類對象,那么一定能夠使用其子類對象。把基類都替。把基類都替換成它的子類,程序?qū)⒉粫a(chǎn)生任何錯誤和異常,反過換成它的子類,程序?qū)⒉粫a(chǎn)
18、生任何錯誤和異常,反過來則不成立,如果一個軟件實體使用的是一個子類的話,來則不成立,如果一個軟件實體使用的是一個子類的話,那么它不一定能夠使用基類。那么它不一定能夠使用基類。里氏代換原則是實現(xiàn)開閉原則的重要方式之一,由于使里氏代換原則是實現(xiàn)開閉原則的重要方式之一,由于使用基類對象的地方都可以使用子類對象,因此用基類對象的地方都可以使用子類對象,因此在程序中在程序中盡量使用基類類型來對對象進(jìn)行定義,而在運行時再確盡量使用基類類型來對對象進(jìn)行定義,而在運行時再確定其子類類型,用子類對象來替換父類對象定其子類類型,用子類對象來替換父類對象。里氏代換原則 w 里氏代換原則分析喜歡動物喜歡貓 因為貓是動
19、物 里氏代換原則 w 里氏代換原則實例實例說明實例說明 某系統(tǒng)需要實現(xiàn)對重要數(shù)據(jù)(如用戶密碼)的加密處理,在數(shù)據(jù)操作類(DataOperator)中需要調(diào)用加密類中定義的加密算法,系統(tǒng)提供了兩個不同的加密類,CipherA和CipherB,它們實現(xiàn)不同的加密方法,在DataOperator中可以選擇其中的一個實現(xiàn)加密操作。如圖所示:里氏代換原則 w 里氏代換原則實例實例說明實例說明 如果需要更換一個加密算法類或者增加并使用一個新的加密算法類,如將CipherA改為CipherB,則需要修改客戶類Client和數(shù)據(jù)操作類DataOperator的源代碼,違背了開閉原則。 現(xiàn)使用里氏代換原則對其進(jìn)
20、行重構(gòu),使得系統(tǒng)可以靈活擴(kuò)展,符合開閉原則。里氏代換原則 w 里氏代換原則實例實例解析實例解析 依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則定義 依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則(Dependence Inversion Principle, DIP)的定義的定義如下:如下: 高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。 其英文定義為:其英文定義為: High level modules should not depend upon low level modules, both should depend upon abstractions. Abstractions
21、 should not depend upon details, details should depend upon abstractions. 另一種表述為:另一種表述為: 要針對接口編程,不要針對實現(xiàn)編程。 其英文定義為:其英文定義為: Program to an interface, not an implementation.依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析 依賴倒轉(zhuǎn)原則是依賴倒轉(zhuǎn)原則是Robert C. Martin在在1996年為年為C+ Reporter所寫的專欄所寫的專欄Engineering Notebook的第三篇,后來加入到他在的第三篇,后來加入到他在2002年出版的
22、經(jīng)典著作年出版的經(jīng)典著作Agile Software Development, Principles, Patterns, and Practices中。中。依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析簡單來說,依賴倒轉(zhuǎn)原則就是指:簡單來說,依賴倒轉(zhuǎn)原則就是指:代碼要依賴于抽象的代碼要依賴于抽象的類,而不要依賴于具體的類類,而不要依賴于具體的類;要針對接口或抽象類編程,要針對接口或抽象類編程,而不是針對具體類編程而不是針對具體類編程。實現(xiàn)開閉原則的關(guān)鍵是抽象化,并且從抽象化導(dǎo)出具體實現(xiàn)開閉原則的關(guān)鍵是抽象化,并且從抽象化導(dǎo)出具體化實現(xiàn),如果說化實現(xiàn),如果說開閉原則是面向?qū)ο笤O(shè)計的目標(biāo)的話開閉原則是面向?qū)?/p>
23、象設(shè)計的目標(biāo)的話,那么那么依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計的主要手段依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計的主要手段。 依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析依賴倒轉(zhuǎn)原則的常用實現(xiàn)方式之依賴倒轉(zhuǎn)原則的常用實現(xiàn)方式之一是一是在代碼中使用抽象類,而將在代碼中使用抽象類,而將具體類放在配置文件中具體類放在配置文件中。 “將抽象放進(jìn)代碼,將細(xì)節(jié)放進(jìn)元數(shù)據(jù)” Put Abstractions in Code, Details in Metadata(程序員修煉之道:從小工到專家(The Pragmatic programmer: from journeyman to master) )依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析類
24、之間的耦合類之間的耦合 零耦合關(guān)系 具體耦合關(guān)系 抽象耦合關(guān)系 依賴倒轉(zhuǎn)原則要求客戶端依賴于抽象耦合,依賴倒轉(zhuǎn)原則要求客戶端依賴于抽象耦合,以抽象方以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析依賴注入依賴注入 依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析依賴注入依賴注入 構(gòu)造注入(Constructor Injection):通過構(gòu)造函數(shù)注入實例變量。 設(shè)值注入(Setter Injection):通過Setter方法注入實例變量。 接口注入(Interface Injection):通過接口方法注入實例變量。 依賴倒轉(zhuǎn)原則w 依賴倒轉(zhuǎn)原則實例實例說明
25、實例說明 某系統(tǒng)提供一個數(shù)據(jù)轉(zhuǎn)換模塊,可以將來自不同數(shù)據(jù)源的數(shù)據(jù)轉(zhuǎn)換成多種格式,如可以轉(zhuǎn)換來自數(shù)據(jù)庫的數(shù)據(jù)(DatabaseSource)、也可以轉(zhuǎn)換來自文本文件的數(shù)據(jù)(TextSource),轉(zhuǎn)換后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer)等。依賴倒轉(zhuǎn)原則w 依賴倒轉(zhuǎn)原則實例實例說明實例說明 由于需求的變化,該系統(tǒng)可能需要增加新的數(shù)據(jù)源或者新的文件格式,每增加一個新的類型的數(shù)據(jù)源或者新的類型的文件格式,客戶類MainClass都需要修改源代碼,以便使用新的類,但違背了開閉原則?,F(xiàn)使用依賴倒轉(zhuǎn)原則對其進(jìn)行重構(gòu)。 依賴倒轉(zhuǎn)原則w 依
26、賴倒轉(zhuǎn)原則實例實例解析實例解析 接口隔離原則w 接口隔離原則定義 接口隔離原則接口隔離原則(Interface Segregation Principle, ISP)的定義如下:的定義如下: 客戶端不應(yīng)該依賴那些它不需要的接口。 其英文定義為:其英文定義為: Clients should not be forced to depend upon interfaces that they do not use. 注意,在該定義中的接口指的是所定義的方法。注意,在該定義中的接口指的是所定義的方法。 另一種定義方法如下:另一種定義方法如下: 一旦一個接口太大,則需要將它分割成一些更細(xì)小的接口,使用該
27、接口的客戶端僅需知道與之相關(guān)的方法即可。 其英文定義為:其英文定義為: Once an interface has gotten too fat it needs to be split into smaller and more specific interfaces so that any clients of the interface will only know about the methods that pertain to them. 接口隔離原則w 接口隔離原則分析 接口隔離原則是指使接口隔離原則是指使用多個專門的接口,而不使用單用多個專門的接口,而不使用單一的總接口一的總接
28、口。每一個接口應(yīng)該承擔(dān)一種相對獨立的角。每一個接口應(yīng)該承擔(dān)一種相對獨立的角色,不多不少,不干不該干的事,該干的事都要干。色,不多不少,不干不該干的事,該干的事都要干。 (1) 一個接口就只代表一個角色,每個角色都有它特定的一個接口,此時這個原則可以叫做“角色隔離原則”。 (2) 接口僅僅提供客戶端需要的行為,即所需的方法,客戶端不需要的行為則隱藏起來,應(yīng)當(dāng)為客戶端提供盡可能小的單獨的接口,而不要提供大的總接口。 接口隔離原則w 接口隔離原則分析 使用接口隔離原則拆分接口時,首先必須滿足使用接口隔離原則拆分接口時,首先必須滿足單一職單一職責(zé)原則責(zé)原則,將一組相關(guān)的操作定義在一個接口中,且在,將一
29、組相關(guān)的操作定義在一個接口中,且在滿足高內(nèi)聚的前提下,接口中的方法越少越好。滿足高內(nèi)聚的前提下,接口中的方法越少越好??梢栽谶M(jìn)行系統(tǒng)設(shè)計時采用可以在進(jìn)行系統(tǒng)設(shè)計時采用定制服務(wù)定制服務(wù)的方式,即的方式,即為不為不同的客戶端提供寬窄不同的接口同的客戶端提供寬窄不同的接口,只提供用戶需要的,只提供用戶需要的行為,而隱藏用戶不需要的行為。行為,而隱藏用戶不需要的行為。接口隔離原則w 接口隔離原則實例 實例說明實例說明 下圖展示了一個擁有多個客戶類的系統(tǒng),在系統(tǒng)中定義了一個巨大的接口(胖接口)AbstractService來服務(wù)所有的客戶類??梢允褂媒涌诟綦x原則對其進(jìn)行重構(gòu)。接口隔離原則w 接口隔離原則
30、實例 實例解析實例解析 ClientAAbstractServiceA+ operatorA ().: voidClientBClientCConcreteService+operatorA ()operatorB ()operatorC (): void: void: voidAbstractServiceB+ operatorB ().: voidAbstractServiceC+ operatorC ().: void合成復(fù)用原則w 合成復(fù)用原則定義 合成復(fù)用原則合成復(fù)用原則(Composite Reuse Principle, CRP)又稱為組合又稱為組合/聚合復(fù)用原則聚合復(fù)用原則(C
31、omposition/ Aggregate Reuse Principle, CARP),其定義如下:,其定義如下: 盡量使用對象組合,而不是繼承來達(dá)到復(fù)用的目的。 其英文定義為:其英文定義為: Favor composition of objects over inheritance as a reuse mechanism.合成復(fù)用原則w 合成復(fù)用原則分析 合成復(fù)用原則就是指在一個新的對象里通過合成復(fù)用原則就是指在一個新的對象里通過關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)(包括組合關(guān)系和聚合關(guān)系)來使用一些已有的對象,來使用一些已有的對象,使之成為新對象的一部分;新對象使之成為新對象的一
32、部分;新對象通過委派調(diào)用已有通過委派調(diào)用已有對象的方法達(dá)到復(fù)用其已有功能的目的對象的方法達(dá)到復(fù)用其已有功能的目的。簡言之:要。簡言之:要盡量使用組合盡量使用組合/聚合關(guān)系,少用繼承聚合關(guān)系,少用繼承。合成復(fù)用原則w 合成復(fù)用原則分析 在面向?qū)ο笤O(shè)計中,可以通過兩種基本方法在不同的在面向?qū)ο笤O(shè)計中,可以通過兩種基本方法在不同的環(huán)境中復(fù)用已有的設(shè)計和實現(xiàn),即通過環(huán)境中復(fù)用已有的設(shè)計和實現(xiàn),即通過組合組合/聚合關(guān)系聚合關(guān)系或通過或通過繼承繼承。 繼承復(fù)用:實現(xiàn)簡單,易于擴(kuò)展。破壞系統(tǒng)的封裝性;從基類繼承而來的實現(xiàn)是靜態(tài)的,不可能在運行時發(fā)生改變,沒有足夠的靈活性;只能在有限的環(huán)境中使用。(“白箱”復(fù)
33、用 ) 組合/聚合復(fù)用:耦合度相對較低,選擇性地調(diào)用成員對象的操作;可以在運行時動態(tài)進(jìn)行。(“黑箱”復(fù)用 )合成復(fù)用原則w 合成復(fù)用原則分析 組合組合/聚合可以聚合可以使系統(tǒng)更加靈活使系統(tǒng)更加靈活,類與類之間的,類與類之間的耦合度耦合度降低降低,一個類的變化對其他類造成的影響相對較少,一個類的變化對其他類造成的影響相對較少,因此一般因此一般首選使用組合首選使用組合/聚合來實現(xiàn)復(fù)用聚合來實現(xiàn)復(fù)用;其次才考慮;其次才考慮繼承,在使用繼承時,需要嚴(yán)格遵循里氏代換原則,繼承,在使用繼承時,需要嚴(yán)格遵循里氏代換原則,有效使用繼承會有助于對問題的理解,降低復(fù)雜度,有效使用繼承會有助于對問題的理解,降低復(fù)雜
34、度,而濫用繼承反而會增加系統(tǒng)構(gòu)建和維護(hù)的難度以及系而濫用繼承反而會增加系統(tǒng)構(gòu)建和維護(hù)的難度以及系統(tǒng)的復(fù)雜度,因此需要統(tǒng)的復(fù)雜度,因此需要慎重使用繼承復(fù)用慎重使用繼承復(fù)用。合成復(fù)用原則w 合成復(fù)用原則實例 實例說明實例說明 某教學(xué)管理系統(tǒng)部分?jǐn)?shù)據(jù)庫訪問類設(shè)計如圖所示:合成復(fù)用原則w 合成復(fù)用原則實例 實例說明實例說明 如果需要更換數(shù)據(jù)庫連接方式,如原來采用JDBC連接數(shù)據(jù)庫,現(xiàn)在采用數(shù)據(jù)庫連接池連接,則需要修改DBUtil類源代碼。如果StudentDAO采用JDBC連接,但是TeacherDAO采用連接池連接,則需要增加一個新的DBUtil類,并修改StudentDAO或TeacherDAO的
35、源代碼,使之繼承新的數(shù)據(jù)庫連接類,這將違背開閉原則,系統(tǒng)擴(kuò)展性較差。 現(xiàn)使用合成復(fù)用原則對其進(jìn)行重構(gòu)。合成復(fù)用原則w 合成復(fù)用原則實例 實例解析實例解析 DBUtil+ getConnection ().: ConnectionStudentDAO- dBOperator : DBUtil+setDBOperator (DBUtil dBOperator)findStudentById (String id)findAllStudents ()save (StudentDTO student).: void: StudentDTO: List: intTeacherDAO- dBOperato
36、r : DBUtil+setDBOperator (DBUtil dBOperator)findTeacherById (String id)findAllTeachers ()save (TeacherDTO teacher).: void: TeacherDTO: List: intNewDBUtil+ getConnection ().: Connection迪米特法則 w 迪米特法則定義 迪米特法則迪米特法則(Law of Demeter, LoD)又稱為最少知識原則又稱為最少知識原則(Least Knowledge Principle, LKP),它有多種定義方法,其中幾種典,它有多
37、種定義方法,其中幾種典型定義如下:型定義如下: (1) 不要和“陌生人”說話。英文定義為:Dont talk to strangers. (2) 只與你的直接朋友通信。英文定義為:Talk only to your immediate friends. (3) 每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關(guān)的軟件單位。英文定義為:Each unit should have only limited knowledge about other units: only units closely related to the current unit.迪米特法則 w 迪
38、米特法則分析迪米特法則來自于迪米特法則來自于1987年秋美國東北大學(xué)年秋美國東北大學(xué)(Northeastern University)一個一個名為名為“Demeter”的的研究項目研究項目。簡單地說,迪米特法則就是指簡單地說,迪米特法則就是指一個軟件實體應(yīng)當(dāng)盡可一個軟件實體應(yīng)當(dāng)盡可能少的與其他實體發(fā)生相互作用能少的與其他實體發(fā)生相互作用。這樣,當(dāng)一個模塊。這樣,當(dāng)一個模塊修改時,就會盡量少的影響其他的模塊,擴(kuò)展會相對修改時,就會盡量少的影響其他的模塊,擴(kuò)展會相對容易,這是對軟件實體之間通信的限制,它要求限制容易,這是對軟件實體之間通信的限制,它要求限制軟件實體之間通信的寬度和深度。軟件實體之間
39、通信的寬度和深度。迪米特法則 w 迪米特法則分析 在迪米特法則中,對于一個對象,其朋友包括以下幾類:在迪米特法則中,對于一個對象,其朋友包括以下幾類: (1) 當(dāng)前對象本身(this); (2) 以參數(shù)形式傳入到當(dāng)前對象方法中的對象; (3) 當(dāng)前對象的成員對象; (4) 如果當(dāng)前對象的成員對象是一個集合,那么集合中的元素也都是朋友; (5) 當(dāng)前對象所創(chuàng)建的對象。 任何一個對象,如果滿足上面的條件之一,就是當(dāng)前對象的任何一個對象,如果滿足上面的條件之一,就是當(dāng)前對象的“朋朋友友”,否則就是,否則就是“陌生人陌生人”。迪米特法則 w 迪米特法則分析 迪米特法則可分為狹義法則和廣義法則。迪米特法則可分為狹義法則和廣義法則。在狹義的迪米特法則中,在狹義的迪米特法則中,如果兩個類之間不必彼此直接通信如果兩個類之間不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用直接的相互作用,如果其中的一個類需要調(diào)用另一個類的某一個,如果其中的一個類需要調(diào)用另一個類的某一個方法的話,可以通過方法的話,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用第三者轉(zhuǎn)發(fā)這個調(diào)用。 迪米特法則 w 迪米特法則分析 狹義的迪米特法則:可以狹義的迪米特法則:可以降低類之間的耦合降低類之間的耦合,但是會在系統(tǒng)中增加大量,但是會在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年信息安全意識培訓(xùn)與宣傳手冊
- 財務(wù)報銷及審核制度
- 辦公室員工培訓(xùn)記錄與檔案制度
- 辦公室保密文件查閱與審批制度
- 2026年燈湖第三小學(xué)面向社會招聘語文、數(shù)學(xué)臨聘教師備考題庫及1套參考答案詳解
- 2026年西安交通大學(xué)電信學(xué)部管理輔助人員招聘備考題庫及1套參考答案詳解
- 2026年湖南蓉園集團(tuán)有限公司公開招聘備考題庫含答案詳解
- 2026年江西興宜全過程項目咨詢有限公司招聘造價工程師備考題庫完整參考答案詳解
- 中國東方航空技術(shù)有限公司2026招聘備考題庫帶答案詳解
- 2026年鎮(zhèn)康縣騰勢口岸經(jīng)營管理有限公司行政管理崗招聘備考題庫及參考答案詳解
- GB/T 46758-2025紙漿硫酸鹽法蒸煮液總堿、活性堿和有效堿的測定(電位滴定法)
- 2026屆福建省龍巖市龍巖一中生物高一第一學(xué)期期末綜合測試試題含解析
- 二元思辨:向外探索(外)與向內(nèi)審視(內(nèi))-2026年高考語文二元思辨作文寫作全面指導(dǎo)
- 智能清掃機(jī)器人設(shè)計與研發(fā)方案
- 《中華人民共和國危險化學(xué)品安全法》全套解讀
- 糖尿病足護(hù)理指導(dǎo)
- 甲狀腺腫瘤的課件
- 新型鋁合金雨棚施工方案
- 2025年國家開放大學(xué)《社會調(diào)查研究方法》期末考試復(fù)習(xí)試題及答案解析
- 《數(shù)字經(jīng)濟(jì)概論》全套教學(xué)課件
- 風(fēng)險管理與內(nèi)部控制-全套課件
評論
0/150
提交評論