<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    GHawk

    敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則)

    開閉原則很簡單,一句話:“Closed for Modification; Open for Extension”——“對(duì)變更關(guān)閉;對(duì)擴(kuò)展開放”。開閉原則其實(shí)沒什么好講的,我將其歸結(jié)為一個(gè)高層次的設(shè)計(jì)總則。就這一點(diǎn)來講,OCP的地位應(yīng)該比SRP優(yōu)先。

    OCP的動(dòng)機(jī)很簡單:軟件是變化的。不論是優(yōu)質(zhì)的設(shè)計(jì)還是低劣的設(shè)計(jì)都無法回避這一問題。OCP說明了軟件設(shè)計(jì)應(yīng)該盡可能地使架構(gòu)穩(wěn)定而又容易滿足不同的需求。

    為什么要OCP?答案也很簡單——重用。

    “重用”,并不是什么軟件工程的專業(yè)詞匯,它是工程界所共用的詞匯。早在軟件出現(xiàn)前,工程師們就在實(shí)踐“重用”了。比如機(jī)械產(chǎn)品,通過零部件的組裝得到最終的能夠使用的工具。由于機(jī)械部件的設(shè)計(jì)和制造過程是極其復(fù)雜的,所以互換性是一個(gè)重要的特性。一輛車可以用不同的發(fā)動(dòng)機(jī)、不同的變速箱、不同的輪胎……很多東西我們直接買來裝上就可以了。這也是一個(gè)OCP的例子。(可能是由于我是搞機(jī)械出身的吧,所以就舉些機(jī)械方面的例子^_^)。

    如何在OO中引入OCP原則?把對(duì)實(shí)體的依賴改為對(duì)抽象的依賴就行了。下面的例子說明了這個(gè)過程:

    05賽季的時(shí)候,一輛F1賽車有一臺(tái)V10引擎。但是到了06賽季,國際汽聯(lián)修改了規(guī)則,一輛F1賽車只能安裝一臺(tái)V8引擎。車隊(duì)很快投入了新賽車的研發(fā),不幸的是,從工程師那里得到消息,舊車身的設(shè)計(jì)不能夠裝進(jìn)新研發(fā)的引擎。我們不得不為新的引擎重新打造車身,于是一輛新的賽車誕生了。但是,麻煩的事接踵而來,國際汽聯(lián)頻頻修改規(guī)則,搞得設(shè)計(jì)師在“賽車”上改了又改,最終變得不成樣子,只能把它廢棄。

    OCP-fig1.JPG

    為了能夠重用這輛昂貴的賽車,工程師們提出了解決方案:首先,在車身的設(shè)計(jì)上預(yù)留出安裝引擎的位置和管線。然后,根據(jù)這些設(shè)計(jì)好的規(guī)范設(shè)計(jì)引擎(或是引擎的適配器)。于是,新的賽車設(shè)計(jì)方案就這樣誕生了。

     OCP-fig2.JPG

    顯然,通過重構(gòu),這里應(yīng)用的是一個(gè)典型的Bridge模式。這個(gè)實(shí)現(xiàn)的關(guān)鍵之處在于我們預(yù)先給引擎留出了位置!我們不必因?yàn)閷?duì)引擎的規(guī)則的頻頻變更而制造相當(dāng)多的車身,而是盡可能地沿用和改良現(xiàn)有的車身。
    說到這里,想說一說OO設(shè)計(jì)的一個(gè)誤區(qū)。
    學(xué)習(xí)OO語言的時(shí)候,為了能夠說明“繼承”(或者說“is-a”)這個(gè)概念,教科書上經(jīng)常用實(shí)際生活中的例子來解釋。比如汽車是車,電車是車,F(xiàn)1賽車是汽車,所以車是汽車、電車、F1賽車的上層抽象。這個(gè)例子并沒有錯(cuò)。問題是,這樣的例子過于“形象”了!如果OO設(shè)計(jì)直接就可以將現(xiàn)實(shí)生活中的概念引用過來,那也就不需要什么軟件工程師了!OO設(shè)計(jì)的關(guān)鍵概念是抽象。如果沒有抽象,那所有的軟件工程師的努力都是徒勞的。因?yàn)槿绻麤]有抽象,我們只能去構(gòu)造世界中每一個(gè)對(duì)象。上面這個(gè)例子中,我們應(yīng)該看到“引擎”這個(gè)抽象的存在,因?yàn)檐囮?duì)的工程師們?yōu)樗A(yù)留了位置,為它制定了設(shè)計(jì)規(guī)范。
    上面這個(gè)設(shè)計(jì)也實(shí)現(xiàn)了后面要說的DIP(依賴倒置原則)。但是請(qǐng)記住,OCP是OO設(shè)計(jì)原則中高層次的原則,其余的原則對(duì)OCP提供了不同程度的支持。為了實(shí)現(xiàn)OCP,我們會(huì)自覺或者不自覺地用到其它原則或是諸如Bridge、Decorator等設(shè)計(jì)模式。然而,對(duì)于一個(gè)應(yīng)用系統(tǒng)而言,實(shí)現(xiàn)OCP并不是設(shè)計(jì)目的,我們所希望的只是一個(gè)穩(wěn)定的架構(gòu)。所以對(duì)OCP的追求也應(yīng)該適可而止,不要陷入過渡設(shè)計(jì)。正如Martin本人所說:“No significant program can be 100% closed.”“Closure not complete but strategic”

    (下一篇就要講LSP了,我覺得這是意義最為重要的OO設(shè)計(jì)原則,它直指當(dāng)今主流OO語言的軟肋,點(diǎn)出了OO設(shè)計(jì)的精髓。)

    posted on 2006-01-18 00:26 GHawk 閱讀(7575) 評(píng)論(7)  編輯  收藏 所屬分類: 軟件過程學(xué)習(xí)筆記

    評(píng)論

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則) 2006-01-18 11:54 Samuel Cai

    你自己的例子?感覺和書上想闡述的想法不一樣。  回復(fù)  更多評(píng)論   

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則) 2006-01-18 12:14 GHawk

    To Samuel Cai,
    說的有道理。
    寫的時(shí)候一直在斟酌哪樣的例子比較合適,因?yàn)镺CP相當(dāng)抽象,所以選出好的例子很難,要說明一定要以某種模式實(shí)現(xiàn)OCP很困難,我的這個(gè)例子有點(diǎn)類似書中OCP那章一開始那個(gè)Client/Server的例子。不過,要舉出違反OCP的例子倒是不少。最典型的就是通過RTTI(運(yùn)行時(shí)類型鑒別)+ switch 或是 if-else 來進(jìn)行設(shè)計(jì)。這樣的用法越多,封閉性就越差,模塊的剛性也就越強(qiáng)。OCP主張?jiān)谠O(shè)計(jì)中采用多態(tài)等動(dòng)態(tài)機(jī)制取代靜態(tài)機(jī)制。當(dāng)然,通過配置文件的方式進(jìn)行模塊的動(dòng)態(tài)配置也是實(shí)現(xiàn)OCP的一種手段。  回復(fù)  更多評(píng)論   

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則) 2006-01-18 16:58 啦啦啦

    誠然.感覺Interface的引入是對(duì)OO的很大的補(bǔ)充,使人們不用再對(duì)"繼承"的概念含糊不清了

    比如AbstractRaceCar需要的是一個(gè)能夠提供動(dòng)了的東東,暫時(shí)叫他為"IEngeer",只要大小合適,能夠提供動(dòng)力即可.V10可知?jiǎng)偃?如果V8能夠符合這個(gè)要求的話也行,甚至是舒馬赫的雙腿--只要他能把他的腿伸進(jìn)去,我們就不用違心的用多繼承說舒馬赫也是從"IEngeer"派生而來的,呵呵  回復(fù)  更多評(píng)論   

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則) 2006-01-18 18:07 江南白衣

    一直覺得這本書改錯(cuò)名,嚴(yán)重的投機(jī)"敏捷"潮流.  回復(fù)  更多評(píng)論   

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則) 2006-01-18 18:17 GHawk

    的確有投機(jī)之嫌,說敏捷過程的東西太少了,就幾章而已。^_^  回復(fù)  更多評(píng)論   

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則) 2006-03-06 14:13 xiaofengown@sina.com

    講的比效通俗易懂  回復(fù)  更多評(píng)論   

    # re: 敏捷軟件開發(fā) 讀書筆記 (3)——OO五大原則(2.OCP——開閉原則)[未登錄] 2007-04-29 10:29

    如果OO設(shè)計(jì)直接就可以將現(xiàn)實(shí)生活中的概念引用過來,那也就不需要什么軟件工程師了!OO設(shè)計(jì)的關(guān)鍵概念是抽象。如果沒有抽象,那所有的軟件工程師的努力都是徒勞的。因?yàn)槿绻麤]有抽象,我們只能去構(gòu)造世界中每一個(gè)對(duì)象。


    太經(jīng)典了,謝謝  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 免费黄色一级毛片| 97视频热人人精品免费| 亚洲电影日韩精品| 青青免费在线视频| 免费一级特黄特色大片在线观看| 亚洲欧洲日产国码久在线| 成人免费看片又大又黄| 亚洲a无码综合a国产av中文| 午夜网站免费版在线观看| 亚洲日本VA中文字幕久久道具| 成年女人免费视频播放体验区| 久久亚洲国产成人影院| 国产精品成人四虎免费视频| 亚洲日韩一区精品射精| 亚洲啪啪免费视频| 亚洲制服丝袜在线播放| 美女网站免费福利视频| 亚洲女女女同性video| 亚洲av中文无码| a级黄色毛片免费播放视频| 亚洲网址在线观看你懂的| 91麻豆最新在线人成免费观看 | 亚洲精品网站在线观看你懂的| 四虎成年永久免费网站| 亚洲综合激情五月丁香六月| 国产一区二区三区在线免费| a级毛片免费观看在线| 久久综合亚洲鲁鲁五月天| 午夜男人一级毛片免费 | 久久免费99精品国产自在现线| 亚洲欧洲国产精品香蕉网| 国产免费一区二区三区| 久久精品国产亚洲AV天海翼| 亚洲人成影院在线无码按摩店| 国产成人精品免费视频大全麻豆 | 青青青国产免费一夜七次郎 | 视频免费1区二区三区| 久久久久久a亚洲欧洲AV| 在线看片人成视频免费无遮挡| www一区二区www免费| 亚洲国产精品久久人人爱|