小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

面向?qū)ο笤O(shè)計(jì)原則總結(jié)

 Baruch 2017-08-04

參考博文:http://www.cnblogs.com/shaosks/category/351488.html

面向?qū)ο笤O(shè)計(jì)的原則主要有:?jiǎn)我宦氊?zé)原則,開(kāi)放封閉原則,里氏替換原則,依賴(lài)倒置原則,迪米特法則,合成/聚合復(fù)用原則。下面將對(duì)每個(gè)原則做一個(gè)學(xué)習(xí)理解與總結(jié),加深對(duì)面向?qū)ο蟮睦斫猓龠M(jìn)工作中對(duì)這些原則的運(yùn)用。

1、單一職責(zé)原則(Single Responsibility Principle  SRP)一個(gè)類(lèi)只做一件事情

There should never be more than one reson for a class to change。也就是說(shuō)引起一個(gè)類(lèi)改變的原因只能有一個(gè),一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多應(yīng)進(jìn)行分離,使程序設(shè)計(jì)達(dá)到高內(nèi)聚低耦合的原則。從而使一個(gè)功能的改變只需要修改一個(gè)類(lèi)而不影響到其他的功能。例如作者所說(shuō)的調(diào)制解調(diào)器,應(yīng)該將連接和數(shù)據(jù)傳送兩個(gè)功能分開(kāi)抽象出兩個(gè)接口,而調(diào)制解調(diào)器同時(shí)實(shí)現(xiàn)這兩個(gè)接口實(shí)現(xiàn)鏈接和數(shù)據(jù)傳送的功能,因此當(dāng)鏈接的功能改變時(shí)對(duì)數(shù)據(jù)傳送功能沒(méi)有產(chǎn)生任何影響。

單一職責(zé)原則優(yōu)點(diǎn):降低類(lèi)的復(fù)雜性,提高可維護(hù)性,提高可讀性,降低需求變化帶來(lái)的風(fēng)險(xiǎn)。

2、開(kāi)放封閉原則(Open-Closed Principle OCP)面向抽象編程

開(kāi)放封閉原則是所有面向?qū)ο笤瓌t的核心,要求軟件實(shí)體應(yīng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。軟件設(shè)計(jì)本身追求的目標(biāo)就是封裝變化,降低耦合,而開(kāi)放封閉原則正是對(duì)這一目標(biāo)的直接體現(xiàn)。

開(kāi)放封閉原則的實(shí)現(xiàn):實(shí)現(xiàn)思想就是對(duì)抽象編程,而不是對(duì)具體編程,因?yàn)槌橄笙鄬?duì)穩(wěn)定。讓類(lèi)依賴(lài)于固定的抽象,所以對(duì)修改就是封閉的;通過(guò)面向?qū)ο蟮睦^承和多態(tài)機(jī)制,可以實(shí)現(xiàn)對(duì)抽象體的繼承,通過(guò)重寫(xiě)其方法來(lái)改變固定的行為,實(shí)現(xiàn)新的擴(kuò)展方法,所以對(duì)于擴(kuò)展就是開(kāi)放的。

開(kāi)放封閉主要是兩方面,對(duì)擴(kuò)展開(kāi)放,意味著有新的需求或變化時(shí),可以對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況;對(duì)修改封閉,意味著一旦設(shè)計(jì)完成,就可以獨(dú)立其工作,而不要對(duì)類(lèi)進(jìn)行任何修改。

如何實(shí)現(xiàn)耦合度和靈活性兼得呢?那就是抽象,將業(yè)務(wù)功能抽象為接口,當(dāng)業(yè)務(wù)依賴(lài)于固定的抽象時(shí),對(duì)修改就是封閉的,而通過(guò)繼承和多態(tài),從抽象體中擴(kuò)展出新的實(shí)現(xiàn),這就是對(duì)擴(kuò)展的開(kāi)放。這樣當(dāng)業(yè)務(wù)變成時(shí),只需要修改對(duì)應(yīng)的業(yè)務(wù)實(shí)現(xiàn)類(lèi)即可,其他不相干的業(yè)務(wù)就不必修改。當(dāng)業(yè)務(wù)增加時(shí),只需要增加業(yè)務(wù)的實(shí)現(xiàn)就可以了。

拒絕濫用抽象,只將經(jīng)常變化的部分進(jìn)行抽象。

3、里氏替換原則,(Liskov Substitution Principle LSP)子類(lèi)可以替代父類(lèi)

里氏替換原則講的是基類(lèi)和子類(lèi)的關(guān)系,指任何基類(lèi)可以出現(xiàn)的地方,子類(lèi)一定可以出現(xiàn)。繼承必須保證超類(lèi)中所擁有的性質(zhì)在子類(lèi)中仍然成立,也就是說(shuō)子類(lèi)必須能夠替換成它們的基類(lèi)。Liskov替換原則主要用來(lái)約束繼承的泛濫問(wèn)題。

如果子類(lèi)不能完整的實(shí)現(xiàn)父類(lèi)的方法,建議斷開(kāi)父子繼承關(guān)系,使用依賴(lài),聚合,組合等關(guān)系。

采用里氏替換原則的目的時(shí)增加程序的健壯性,需求變更時(shí)也可以保持良好的兼容性和穩(wěn)定性,即使增加子類(lèi),原有的子類(lèi)可以繼續(xù)運(yùn)行。在實(shí)際項(xiàng)目中,每個(gè)子類(lèi)對(duì)應(yīng)不同的業(yè)務(wù)含義,使用父類(lèi)作為參數(shù),傳遞不同的子類(lèi)完成不同業(yè)務(wù)邏輯。


4、依賴(lài)倒置原則(Dependence Inversion Principle DIP)依賴(lài)于抽象不依賴(lài)于具體

依賴(lài)倒置原則就是高層模塊不應(yīng)該依賴(lài)于底層模塊,而這都應(yīng)該依賴(lài)其抽象。抽象不應(yīng)該依賴(lài)細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)抽象。

抽象:即抽象類(lèi)或接口,是不能實(shí)例化的

細(xì)節(jié):即具體的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)接口或者繼承抽象類(lèi)所產(chǎn)生的累,可通過(guò)關(guān)鍵字new 實(shí)例化。


在實(shí)際編程中我們需要做到三點(diǎn):

  • 底層模塊盡量都要有抽象類(lèi)或者接口,或者兩者都有
  • 變量的聲明類(lèi)型盡量是抽象類(lèi)或者接口
  • 使用繼承時(shí)遵循里氏替換原則

面向過(guò)程的開(kāi)發(fā)是上層調(diào)用下層,上層依賴(lài)于下層,當(dāng)下層劇烈變化時(shí),上層也要跟著變化,這樣導(dǎo)致模塊的復(fù)用性降低而大大提高了開(kāi)發(fā)成本。面向?qū)ο箝_(kāi)發(fā)解決了這個(gè)問(wèn)題,一般情況下,抽象的變化概率較小,讓用戶(hù)依賴(lài)于抽象,實(shí)現(xiàn)細(xì)節(jié)也一倆與抽象。即使實(shí)現(xiàn)細(xì)節(jié)不斷變化,只要抽象不變,客戶(hù)程序就不需要變化,這就大大降低了客戶(hù)域?qū)崿F(xiàn)細(xì)節(jié)的耦合度。

總之,一個(gè)應(yīng)用的主要策略及業(yè)務(wù)往往集成咋高層模塊中,但是這些模塊依賴(lài)于底層模塊時(shí),底層的修改將直接影響到高層模塊,迫使它們也改變,這是不科學(xué)的。應(yīng)該時(shí)處于高層的模塊迫使底層的模塊發(fā)生改變,處于高層的模塊應(yīng)該優(yōu)先于底層的模塊,無(wú)論如何高層模塊也不應(yīng)該依賴(lài)于底層模塊,而且我們能夠服用的時(shí)高層的模塊,只有高層模塊獨(dú)立于底層模塊時(shí),服用才有可能。最終,高層次的模塊不依賴(lài)于底層的模塊,它們都應(yīng)該依賴(lài)于抽象。抽象不應(yīng)該依賴(lài)于具體,具體應(yīng)該依賴(lài)于抽象。

5、迪米特原則(Law of Demeter)又叫最少知識(shí)原則(Least  Knowlege Principle LKP)對(duì)象與對(duì)象之間盡可能少的交互

面向?qū)ο髞?lái)說(shuō),一個(gè)軟件實(shí)體應(yīng)盡可能少的與其他實(shí)體發(fā)生相互作用,降低類(lèi)之間的耦合,每個(gè)類(lèi)都盡量減少對(duì)其他類(lèi)的依賴(lài),這樣做的結(jié)果是很容易實(shí)現(xiàn)模塊的相互獨(dú)立,但可能造成一個(gè)后果,系統(tǒng)中存在大量的中介類(lèi),這些類(lèi)用來(lái)傳遞類(lèi)之間的相互調(diào)用關(guān)系,一定程度增加了系統(tǒng)復(fù)雜度。

迪米特法則在設(shè)計(jì)模式中的門(mén)面模式(Facade)和中介模式(Mediator)中得到應(yīng)用。


6、合成復(fù)用原則又稱(chēng)組合/聚合服用原則(Composite Reuse Principle CRP)復(fù)用時(shí)盡量使用組合/聚合關(guān)系(關(guān)聯(lián)關(guān)系),少用繼承。

合成復(fù)用原則就是在一個(gè)新的對(duì)象里通過(guò)關(guān)聯(lián)關(guān)系來(lái)使用一些已有的對(duì)象,使之成為新對(duì)象的一部分,新對(duì)象通過(guò)委派調(diào)用已有對(duì)象的方法達(dá)到服用功能的目的。

在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,可以通過(guò)兩種方法在不同的環(huán)境中服用已有的設(shè)計(jì)和實(shí)現(xiàn),即通過(guò)組合/聚合或通過(guò)繼承,但首先應(yīng)考慮使用組合/聚合,組合/聚合使系統(tǒng)更加靈活,降低類(lèi)與類(lèi)之間的耦合度,一個(gè)類(lèi)的變化對(duì)其他類(lèi)造成的影響相對(duì)較少,其實(shí)考慮繼承,使用繼承時(shí)嚴(yán)格遵循里氏替換原則,有效使用繼承會(huì)有助于對(duì)問(wèn)題的理解,降低復(fù)雜度,而濫用繼承反而增加系統(tǒng)構(gòu)建與維護(hù)難度以及系統(tǒng)的復(fù)雜度,因此需要謹(jǐn)慎使用繼承復(fù)用。

一般而言,如果兩個(gè)類(lèi)之間時(shí)“Has-a”的關(guān)系應(yīng)使用組合或聚合,如果是“Is-a”的關(guān)系使用繼承。

合成復(fù)用可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)的引用與成員對(duì)象類(lèi)型相同的其他對(duì)象。


總結(jié),通過(guò)以上對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)中原則的梳理,希望以后代碼過(guò)程中能得到更廣泛的應(yīng)用,提高代碼質(zhì)量。




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多