关于面向对象的的设计原则的使用
關(guān)于面向?qū)ο蟮脑瓌t,相信大家都很清楚.但真正使用時(shí),我想我們都會(huì)違反一些原則,因?yàn)橐袷剡@些原則,我們必須要多寫好多代碼.最后得不嘗試. 下面我就關(guān)于這些原則發(fā)表一下個(gè)人的看法:
一、單一職責(zé)原則 ?? 就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并把那些職責(zé)相互分離。測(cè)試驅(qū)動(dòng)的開發(fā)實(shí)踐常常會(huì)在設(shè)計(jì)出現(xiàn)臭味之前就迫使我們分離職責(zé)。?
??這個(gè)很重要 ,我在程序開發(fā)中都會(huì)遵守這個(gè)原則.
二、“開一閉”原則講的是:一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。 這個(gè)規(guī)則說的是,在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展。 從另外一個(gè)角度講,就是所謂的“對(duì)可變性封裝原則”。“對(duì)可變性封裝原則”意味著兩點(diǎn): 1 .一種可變性不應(yīng)當(dāng)散落在代碼的很多角落里,而應(yīng)當(dāng)被封裝到一個(gè)對(duì)象里面。同一種可變性的不同表象意味著同一個(gè)繼承等級(jí)結(jié)構(gòu)中的具體子類。 2.一種可變性不應(yīng)當(dāng)與另一種可變性混合在一起。即類圖的繼承結(jié)構(gòu)一般不應(yīng)超過兩層。 做到“開—閉”原則不是一件容易的事,但是也有很多規(guī)律可循,這些規(guī)律同樣也是設(shè)計(jì)原則,它們是實(shí)現(xiàn)開—閉原則的工具。?
???這個(gè)也比較重要,但現(xiàn)實(shí)中也是比較難實(shí)現(xiàn),經(jīng)常由于業(yè)務(wù)規(guī)則變了,我們不得不更改我們的類.除非一些我們可預(yù)見的,比如緩存,我們有多種實(shí)現(xiàn)的方式,所以通過定義接口的方式.如果我們要換一種緩存方案,我們只要換一個(gè)實(shí)現(xiàn)類就行了.
三、里氏代換原則: 如果對(duì)每一個(gè)類型為T1的對(duì)象o1,都有類型為T2的對(duì)象o2,使得以T1定義的所有程序P在所有對(duì)象o1都換成o2時(shí),程序P的行為沒有變化,那么類型T2是T1的子類型。 即如果一個(gè)軟件實(shí)體使用的是基類的話那么也一定適用于子類。但反過來的代換不成立。 如果有兩個(gè)具體類A和B之間的關(guān)系違反了里氏代換原則,可以在以下兩種重構(gòu)方案中選擇一種: 1 .創(chuàng)建一個(gè)新的抽象類C,作為兩個(gè)具體類的超類,將A和B共同的行為移動(dòng)到C中,從而解決A和B行為不完全一致的問題。 2 .從B到A的繼承關(guān)系改寫為委派關(guān)系。 ??
????這個(gè)我們也經(jīng)常用到,我們經(jīng)常會(huì)把一些類共同的東西,抽象到基類里去實(shí)現(xiàn),比如增加,刪除,修改,查詢等.同時(shí)我們也會(huì)用一些vitual函數(shù),和override去重寫一些基類行為.
四、依賴倒置原則 依賴倒置原則講的是:要依賴于抽象,不要依賴于具體。即針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。針對(duì)接口編程的意思是,應(yīng)當(dāng)使用接口和抽象類進(jìn)行變量的類型聲明、參量的類型聲明,方法的返還類型聲明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。不要針對(duì)實(shí)現(xiàn)編程的意思就是說,不應(yīng)當(dāng)使用具體類進(jìn)行變量的類型聲明、參量的類型聲明,方法的返還類型聲明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。 依賴倒置原則雖然強(qiáng)大,但卻不易實(shí)現(xiàn),因?yàn)橐蕾嚨怪玫木壒?#xff0c;對(duì)象的創(chuàng)建很可能要使用對(duì)象工廠,以避免對(duì)具體類的直接引用,此原則的使用還會(huì)導(dǎo)致大量的類。維護(hù)這樣的系統(tǒng)需要較好的面向?qū)ο蟮脑O(shè)計(jì)知識(shí)。 此外,依賴倒置原則假定所有的具體類都是變化的,這也不總是正確的。有一些具體類可能是相當(dāng)穩(wěn)定、不會(huì)發(fā)生變化的,消費(fèi)這個(gè)具體類實(shí)例的客戶端完全可以依賴于這個(gè)具體類。?
???這個(gè)東西我們就會(huì)經(jīng)常違反的.比如我們的三層架構(gòu),我相信很多人都是直接new一個(gè)對(duì)象去操作的.如果那么多表,我們都是針對(duì)接口編程,我們會(huì)發(fā)現(xiàn)這些東西其實(shí)用處不大.因?yàn)槲覀兇蟛糠猪?xiàng)目的dal層,bll層是不變的.其實(shí)我也用過一個(gè)框架,那里就是所有的dal,bll層都基于IOC編程的.結(jié)果我發(fā)現(xiàn),用起來真的很麻煩的. 我們想增加一個(gè)方法要在4個(gè)地方寫函數(shù). 而且想用F12跟進(jìn)去查看代碼,是跟不進(jìn)去的.只能跟到接口那里.? 最要命的就是它那個(gè)報(bào)錯(cuò).經(jīng)常會(huì)報(bào)配置錯(cuò)誤,其實(shí)一查根本不是配置錯(cuò)誤.只是生成的類有問題
五、接口隔離原則 接口隔離原則講的是:使用多個(gè)專門的接口比使用單一的接口要好。從客戶的角度來說:一個(gè)類對(duì)另外一個(gè)類的依賴性應(yīng)當(dāng)是建立在最小的接口上的。如果客戶端只需要某一些方法的話,那么就應(yīng)當(dāng)向客戶端提供這些需要的方法,而不要提供不需要的方法。提供接口意味著向客戶端作出承諾,過多的承諾會(huì)給系統(tǒng)的維護(hù)造成不必要的負(fù)擔(dān)。?
? 這個(gè)也是我們要去遵守的.
六、合成、聚合復(fù)用原則 合成、聚合復(fù)用原則就是在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部份,新的對(duì)象通過向這些對(duì)象的委派達(dá)到復(fù)用已有功能的目的。這個(gè)原則有一個(gè)簡(jiǎn)短的描述:要盡量使用合成、聚合,盡量不要使用繼承。合成、聚合有如下好處: 新對(duì)象存取成分對(duì)象的唯一方法是通過成分對(duì)象的接口。 這種復(fù)用是黑箱復(fù)用,因?yàn)槌煞謱?duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象所看不到的。 這種復(fù)用可以在運(yùn)行時(shí)間內(nèi)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)的引用與成分對(duì)象類型相同的對(duì)象。 合成、聚合可以應(yīng)用到任何環(huán)境中去,而繼承只能應(yīng)用到一些有限環(huán)境中去。 導(dǎo)致錯(cuò)誤的使用合成、聚合與繼承的一個(gè)常見原因是錯(cuò)誤的把“Has-a”關(guān)系當(dāng)作“Is-a”關(guān)系。如果兩個(gè)類是“Has-a”關(guān)系那么應(yīng)使用合成、聚合,如果是“Is-a”關(guān)系那么可使用繼承。?
??這也是我們經(jīng)常用到的.
七、迪米特法則 迪米特法則說的是一個(gè)對(duì)象應(yīng)該對(duì)其它對(duì)象有盡可能少的了解。即只與你直接的朋友通信,不要跟陌生人說話。如果需要和陌生人通話,而你的朋友與陌生人是朋友,那么可以將你對(duì)陌生人的調(diào)用由你的朋友轉(zhuǎn)發(fā),使得某人只知道朋友,不知道陌生人。換言之,某人會(huì)認(rèn)為他所調(diào)用的是朋友的方法。 以下條件稱為朋友的條件: 當(dāng)前對(duì)象本身。 以參量的形式傳入到當(dāng)前對(duì)象方法中的對(duì)象。 當(dāng)前對(duì)象的實(shí)例變量直接引用的對(duì)象。 當(dāng)前對(duì)象的實(shí)例變量如果是一個(gè)聚集,那么聚集中的元素也都是朋友。 當(dāng)前對(duì)象所創(chuàng)建的對(duì)象。 任何一個(gè)對(duì)象,如果滿足上面的條件之一,就是當(dāng)前對(duì)象的朋友,否則就是陌生人。 迪米特法則的主要用意是控制信息的過載,在將其運(yùn)用到系統(tǒng)設(shè)計(jì)中應(yīng)注意以下幾點(diǎn): 在類的劃分上,應(yīng)當(dāng)創(chuàng)建有弱耦合的類。類之間的耦合越弱,就越有利于復(fù)用。 在類的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng)盡量降低成員的訪問權(quán)限。一個(gè)類不應(yīng)當(dāng)public自己的屬性,而應(yīng)當(dāng)提供取值和賦值的方法讓外界間接訪問自己的屬性。 在類的設(shè)計(jì)上,只要有可能,一個(gè)類應(yīng)當(dāng)設(shè)計(jì)成 在對(duì)其它對(duì)象的引用上,一個(gè)類對(duì)其它對(duì)象的引用應(yīng)該降到最低。?
? ??這個(gè)也是我們要去遵守的.
上面是在對(duì)oop使用原則的理解,不知道大家是如何理解的.
總結(jié)
以上是生活随笔為你收集整理的关于面向对象的的设计原则的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何掌握并在实践中自如运用设计模式
- 下一篇: Yacc 与 Lex 快速入门(词法分析