版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、面向?qū)ο笤O(shè)計(jì)原則面向?qū)ο笤O(shè)計(jì)原則n類設(shè)計(jì)n包設(shè)計(jì)面向?qū)ο笤O(shè)計(jì)原則類設(shè)計(jì) nSRP,單一職責(zé)原則,一個類應(yīng)該有且只有一個改變的理由 nOCP,開放封閉原則,你應(yīng)該能夠不用修改原有類就能擴(kuò)展一個類的行為nLSP,Liskov替換原則,派生類要與其基類自相容nDIP,依賴倒置原則,依賴于抽象而不是實(shí)現(xiàn)nISP,接口隔離原則,客戶只要關(guān)注它們所需的接口nCARP,合成/聚合復(fù)用原則,盡量使用合成/聚合、盡量不要使用繼承nLoD,迪米特法則,不要和陌生人說話單一職責(zé)原則(Single-Responsibility Principle )n就一個類而言,應(yīng)該只專注于做一件事和僅有一個引起它變化的原因 n所
2、謂職責(zé)n可以理解為功能,就是設(shè)計(jì)的這個類功能應(yīng)該只有一個,而不是兩個或更多n也可以理解為引用變化的原因,當(dāng)你發(fā)現(xiàn)有兩個變化會要求我們修改這個類,那么你就要考慮拆分這個類了單一職責(zé)原則(Single-Responsibility Principle )n例子ninterface Modem public void dial(string pno); public void hangup(); public void send(char c); public void recv(); 單一職責(zé)原則(Single-Responsibility Principle )n例子ninterface Dat
3、aChannel public void send(char c); public void recv(); ninterface Connection public void dial(string pno); public void hangup();單一職責(zé)原則(Single-Responsibility Principle )n就像一個人身兼數(shù)職,而這些事情相互關(guān)聯(lián)不大,甚至有沖突,那他就無法很好的解決這些職責(zé),應(yīng)該分到不同的人身上去做才對 n優(yōu)點(diǎn)n消除耦合,減小因需求變化引起代碼僵化性臭味 單一職責(zé)原則(Single-Responsibility Principle )n注意n一個合
4、理的類,應(yīng)該僅有一個引起它變化的原因,即單一職責(zé)n 在沒有變化征兆的情況下應(yīng)用SRP或其他原則是不明智的n 在需求實(shí)際發(fā)生變化時(shí)就應(yīng)該應(yīng)用SRP等原則來重構(gòu)代碼開-閉原則(The Open-Closed Principle)n什么是開-閉原則一個軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。n開-閉原則的優(yōu)越性n通過擴(kuò)展已有的軟件系統(tǒng),可以提供新的行為,以滿足對軟件的新需求n已有的軟件模塊不能再被修改,這使軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性開-閉原則的關(guān)鍵抽象實(shí)現(xiàn)Open-Closed原則,抽象化是關(guān)鍵。 讓模塊操作一個抽象的實(shí)體。由于模塊依賴于一個固定的抽象實(shí)體,因此它可以是不允許被修改的;同時(shí),通過從這
5、個抽象體的派生,也可以擴(kuò)展此模塊的行為對可變性的封裝n考慮系統(tǒng)中什么可能會發(fā)生變化n一種可變性不應(yīng)當(dāng)散落到代碼的很多角落里,而應(yīng)該被封裝到一個對象里n開閉原則具有理想主義的色彩,它是面向?qū)ο笤O(shè)計(jì)的終極目標(biāo)。 n里氏代換原則(LSP)、依賴倒轉(zhuǎn)原則(DIP)、接口隔離原則(ISP)以及抽象類(Abstract Class)、接口(Interace)等等,都可以看作是開閉原則的實(shí)現(xiàn)方法。 里氏代換原則 (The Liskov Substitution Principle)n里氏代換原則的嚴(yán)格表達(dá)如果對每一個類型為T1的對象o1,都有類型為T2的對象o2,使得以T1定義的所有程序P在所有的對象o1都
6、代換成o2時(shí),程序P的行為沒有變化,那么類型T2是類型T1的子類型。n舉例對于父類和子類Base和Derived,若程序能接受Base,那么程序必然可以接受子類Derivedvoid Method (Base b); Derived d;Method (d);里氏代換原則 (The Liskov Substitution Principle)依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)糟糕的設(shè)計(jì)n很難添加新的功能,因?yàn)槊恳惶幐膭佣紩绊懴到y(tǒng)中過多的模塊n當(dāng)你做了一處改動,卻導(dǎo)致系統(tǒng)中的另一個模塊發(fā)生問題n很難在別的應(yīng)用程序中重用這個模塊三種耦合關(guān)系n零耦合(Ni
7、l Coupling)兩個類之間沒有耦合關(guān)系n具體耦合(Concrete Coupling)兩個具體的類之間,經(jīng)由一個類對另一個具體類的直接引用造成的耦合關(guān)系n抽象耦合(Abstract Coupling)一個具體類和一個抽象類(或接口)之間的耦合關(guān)系具體耦合的例子抽象耦合的例子依賴倒轉(zhuǎn)原則n高層模塊不應(yīng)依賴于低層模塊。二者都應(yīng)該依賴于抽象。n抽象不應(yīng)當(dāng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象n要針對接口編程,不要針對實(shí)現(xiàn)編程依賴倒轉(zhuǎn)原則的不足n導(dǎo)致大量的類出現(xiàn),不容易實(shí)現(xiàn)n依賴倒轉(zhuǎn)原則假定所有的具體類都是會變化的,這一點(diǎn)并不總是正確的接口隔離原則 (Interface Segregation Prin
8、ciple)n接口的污染(Interface Contamination)一些沒有經(jīng)驗(yàn)的設(shè)計(jì)師往往想節(jié)省接口的數(shù)量,將一些功能相近或功能相關(guān)的接口合并,并將這看成是代碼優(yōu)化的一部分。接口隔離原則n接口隔離原則(ISP)一個類對另外一個類的依賴應(yīng)當(dāng)是建立在最小的接口上的。換言之,使用多個專門的接口比使用單一的總接口要好。接口隔離原則例子接口隔離原則例子合成/聚合復(fù)用原則 (Composite/ Aggregate Reuse Principle)n定義:在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達(dá)到復(fù)用已有功能的目的n簡單表述:代碼復(fù)用的時(shí)候要盡量
9、的使用合成/聚合,盡量不要使用繼承復(fù)用技術(shù)繼承n優(yōu)點(diǎn)n新的實(shí)現(xiàn)較為容易n修改或擴(kuò)展繼承而來的實(shí)現(xiàn)較為容易n缺點(diǎn)n繼承復(fù)用破壞封裝n如果超類發(fā)生改變,那么子類的實(shí)現(xiàn)不得不改變n從超類繼承而來的實(shí)現(xiàn)是靜態(tài)的,不能在運(yùn)行時(shí)間內(nèi)發(fā)生改變復(fù)用技術(shù)合成/聚合n優(yōu)點(diǎn)n新對象與引用對象溝通的唯一方法是被引用對象的接口,這樣保持了封裝性n這種復(fù)用在運(yùn)行時(shí)刻動態(tài)進(jìn)行n缺點(diǎn)n有較多的對象需要管理迪米特法則(Law of Demeter)n迪米特法則(LoD)又叫最少知識原則:n一個軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用n每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關(guān)的軟件單位。n門
10、面模式(Facade)和中介模式(Mediator),都是迪米特法則應(yīng)用的例子狹義的迪米特法則n如果兩個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中的一個類需要調(diào)用另外一個類的某一個方法,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用。弊端n系統(tǒng)中存在大量的中介類,這些類之所以存在完全是為了傳遞類之間的相互調(diào)用關(guān)系這在一定程度上增加了系統(tǒng)的復(fù)雜度n解決辦法n遵循依賴倒換原則做些折衷處理,讓對象依賴于抽象層,降低耦合例子nSomeone、Friend和Stranger三個類例子nSomeone類有一個方法接受一個Friend類型的變量 npublic class Someone public
11、 void operation1( Friend friend ) Stranger stranger = vide() ; stranger.operation3() ; 例子nSomeone和Friend是朋友類(直接通訊的類)。Friend類持有一個Stranger類的私有對象,他們是朋友類:n public class Friend private Stranger stranger = new Stranger() ; public void operation2() public Stranger provide() return stranger ; 例子nS
12、omeone類和Stranger類不是朋友類,但Someone類卻通過Friend類知道了Stranger類的存在,這顯然違反迪米特法則。 例子n對Someone和Friend類進(jìn)行重構(gòu) npublic class Friend private Stranger stranger = new Stranger() ; public void operation2() public Stranger provide() return stranger ; public void forward() stranger.operation3() ; 例子n重構(gòu)Someone的operation1方法
13、,讓其調(diào)用新提供的forward方法 npublic class Someone public void operation1( Friend friend ) friend.forward() ; 例子n現(xiàn)在Someone對Stranger的依賴完全通過Friend隔離,這樣的結(jié)構(gòu)已經(jīng)符合狹義迪米特法則了。 n缺點(diǎn):會在系統(tǒng)里造出大量的小方法,散落在系統(tǒng)的各個角落。n遵循迪米特法則會使一個系統(tǒng)的局部設(shè)計(jì)簡化,因?yàn)槊恳粋€局部都不會和遠(yuǎn)距離的對象有直接關(guān)聯(lián)。但是,這也會造成系統(tǒng)的不同模塊之間的通信效率降低,也會使系統(tǒng)的不同模塊之間不容易協(xié)調(diào)。 例子n結(jié)合依賴倒轉(zhuǎn)原則,重構(gòu)代碼n添加一個抽象的Ab
14、stractStranger類,使Someone依賴于抽象的“AbstractStranger”角色,而不是具體實(shí)現(xiàn) npublic abstract class AbstractStranger abstract void operation3() ; 例子n讓Stranger從AbstractStranger類繼承npublic class Stranger extends AbstractStranger public void operation3() 例子n重構(gòu)Someone使其依賴抽象的AbstractStrangernpublic class Someone public voi
15、d operation1( Friend friend ) AbstractStranger stranger = vide() ; stranger.operation3() ; 例子n重構(gòu)Friend的provide方法,使其返回抽象角色 npublic class Friend private Stranger stranger = new Stranger() ; public void operation2() public AbstractStranger provide() return stranger ; 例子nAbstractStranger成為Some
16、one的朋友類,而Friend類可以隨時(shí)替換掉AbstractStranger的實(shí)現(xiàn)類,Someone不再需要了解Stranger的內(nèi)部實(shí)現(xiàn)細(xì)節(jié) 廣義迪米特法則 n將迪米特法則運(yùn)用到系統(tǒng)的設(shè)計(jì)中時(shí),應(yīng)注意:n在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類n在類的設(shè)計(jì)上,每一個類都應(yīng)當(dāng)盡量降低成員的訪問權(quán)限n在類的設(shè)計(jì)上,只要有可能,一個類應(yīng)當(dāng)設(shè)計(jì)成不變類n一個對象對其它對象的引用應(yīng)當(dāng)降到最低n盡量降低類的訪問權(quán)限n不要暴露類成員,而應(yīng)該提供相應(yīng)的訪問器面向?qū)ο笤O(shè)計(jì)原則包設(shè)計(jì)nREP,重用等價(jià)原則,重用的粒度就是發(fā)布的粒度 nCCP,共同封閉原則,包中的所有類對于同一類性質(zhì)的變化應(yīng)該是共同封閉的 nCRP,共
17、同重用原則,一個包中的所有類應(yīng)該是共同重用的 nADP,無環(huán)依賴原則,在包的依賴關(guān)系圖中不允許存在環(huán) nSDP,穩(wěn)定依賴原則,朝著穩(wěn)定的方向進(jìn)行依賴 nSAP,穩(wěn)定抽象原則,包的抽象程度應(yīng)該和其穩(wěn)定程度一致 n重用等價(jià)原則(REP)指的是把類放入包中時(shí),應(yīng)考慮把包作為可重用的單元。n這種設(shè)計(jì)原則和用戶的使用心理有關(guān),對于可重用的類,其開發(fā)可能比較快,開發(fā)人員會不斷地推出這些可重用類的升級版本,但對于可重用類的使用者來說,不會隨著可重用類的每次升級而修改自己的系統(tǒng),不過,在需要升級的時(shí)候又會要求很容易地用新版本的可重用類替換舊版本的可重用類,因此設(shè)計(jì)包的一個原則是把類放在包中時(shí)要方便重用,方便對
18、這個包的各個版本的管理。 n共同閉包原則(CCP)指的是把那些需要同時(shí)改變的類放在一個包中。n例如,如果一個類的行為和/或結(jié)構(gòu)的改變要求另一個類作相應(yīng)的改變,則這兩個類應(yīng)放在一個包中;或者在刪除了一個類后,另一個類變成多余的,則這兩個類應(yīng)放在一個包中;或者兩個類之間有大量的消息發(fā)送,則這兩個類也應(yīng)放在一個包中。n共同閉包原則就是要提高包的內(nèi)聚性、降低包與包之間的耦合度,希望在改動或升級一個包的時(shí)候要盡量少影響別的包。n共同重用原則(CRP)指的是不會一起使用的類不要放在同一包中。n這個原則和包的依賴關(guān)系有關(guān)。如果元素A依賴于包P中的某個元素,則表示A會依賴于P中的所有元素。也就是說,包P中的任何一個元素做了修改,則
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電廠煤炭采購合同與環(huán)保型付款策略3篇
- 2025年碳晶片技術(shù)培訓(xùn)及咨詢合同3篇
- 開發(fā)商繼續(xù)履行合同范本(2篇)
- 工廠員工勞動合同(2篇)
- 二零二五版貨物代理合同范本3篇
- 二零二五年度棉花價(jià)格指數(shù)編制與應(yīng)用合同4篇
- 2025年度個人購房借款合同物業(yè)管理服務(wù)協(xié)議3篇
- 二零二五年度中小企業(yè)應(yīng)收賬款質(zhì)押貸款合同范本4篇
- 2025年航空航天產(chǎn)業(yè)投資入股分紅合同3篇
- 2025年度租賃車輛智能監(jiān)控服務(wù)合同遠(yuǎn)程管理4篇
- 廣西水功能區(qū)劃報(bào)告-廣西水利信息網(wǎng)
- 機(jī)關(guān)單位檔案業(yè)務(wù)培訓(xùn)課件20170714
- ??怂咕S修保養(yǎng)使用手冊
- 人力資源部各崗位績效考核表
- 不同樹種的木材物理力學(xué)性能
- 原材料試驗(yàn)工作程序與質(zhì)量管理制度
- 人教版八年級下冊英語單詞默寫(可直接打印)
- 糖廠熱力衡算(6000噸每天)
- 燃?xì)庥邢薰疚kU(xiǎn)作業(yè)安全管理規(guī)定
- 北京市刑事訴訟律師事務(wù)所函(擔(dān)任訴訟代理人適用)格式文書(2020版)
- XX鎮(zhèn)“我為群眾辦實(shí)事”滿意度調(diào)查問卷
評論
0/150
提交評論