gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          開放-封閉原則(OCP:The Open-Closed Principle)

          設(shè)計(jì)模式的原則就是OOD的原則,或者說設(shè)計(jì)模式是為了達(dá)到OOD的遠(yuǎn)景而提出的,所以真想掌握OO的精髓,學(xué)習(xí)設(shè)計(jì)模式是最好的途徑,而想真正掌握設(shè)計(jì)模式的精髓,就必須好好理解一下OOD的設(shè)計(jì)原則.
                  OOD原則的一個(gè)基石就是“開-閉原則”(Open-Closed Principle OCP)。這個(gè)原則最早是由Bertrand Meyer在他的第一版《Object-Oriented Software Construction
          》提出,英文的原文是:Software entities should be open for extension,but closed for modification。A class should be open for extension, but closed for modification.

          Object-Oriented Software Construction 書的封面

          開放-封閉原則:軟件實(shí)體(類,模塊,函數(shù)等等)應(yīng)該是可以擴(kuò)展的,但是不可修改的也就是說,我們?cè)谠O(shè)計(jì)一個(gè)模塊的時(shí)候,可以在不修改這個(gè)模塊的前提下來擴(kuò)展它,也就是,可以在不修改源代碼的情況下擴(kuò)展這個(gè)模塊的行為。

                  滿足OCP的設(shè)計(jì)給系統(tǒng)帶來兩個(gè)無可比擬的優(yōu)越性.
          •     通過擴(kuò)展已有的軟件系統(tǒng),可以提供新的行為,以滿足對(duì)軟件的新需求,使變化中的軟件系統(tǒng)有一定的適應(yīng)性靈活性.
          •     已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統(tǒng)有一定的穩(wěn)定性延續(xù)性.

                  具有這兩個(gè)優(yōu)點(diǎn)的軟件系統(tǒng)是一個(gè)高層次上實(shí)現(xiàn)了復(fù)用的系統(tǒng),也是一個(gè)易于維護(hù)的系統(tǒng)。那么,我們?nèi)绾尾拍茏龅竭@個(gè)原則呢?不能修改而可以擴(kuò)展,這個(gè)看起來 是自相矛盾的,其實(shí)這個(gè)是可以做到的,按面向?qū)ο蟮恼f法,這個(gè)就是不允許更改系統(tǒng)的抽象層,而允許擴(kuò)展的是系統(tǒng)的實(shí)現(xiàn)層.

                  解決問題的關(guān)鍵在抽象化。我們讓模塊依賴于一個(gè)固定的抽象體,這樣它就是不可以修改的;同時(shí),通過這個(gè)抽象體派生,我們就可以擴(kuò)展此模塊的行為功能。如此,這樣設(shè)計(jì)的程序只通過增加代碼來變化而不是通過更改現(xiàn)有代碼來變化,前面提到的修改的副作用就沒有了。

                  "開-閉"原則如果從另外一個(gè)角度講述,就是所謂的"對(duì)可變性封裝原則"(Principle of Encapsulation of Variation, EVP)。講的是找到一個(gè)系統(tǒng)的可變因素,將之封裝起來。在我們考慮一個(gè)系統(tǒng)的時(shí)候,我們不要把關(guān)注的焦點(diǎn)放在什么會(huì)導(dǎo)致設(shè)計(jì)發(fā)生變化上,而是考慮允許什 么發(fā)生變化而不讓這一變化導(dǎo)致重新設(shè)計(jì)。也就是說,我們要積極的面對(duì)變化,積極的包容變化,而不是逃避。

            [SHALL01]將這一思想用一句話總結(jié)為:"找到一個(gè)系統(tǒng)的可變因素,將它封裝起來",并將它命名為"對(duì)可變性的封裝原則"。
             

                "對(duì)可變性的封裝原則"意味者兩點(diǎn):

               1.  一種可變性應(yīng)當(dāng)被封裝到一個(gè)對(duì)象里面,而不應(yīng)當(dāng)散落到代碼的很多角落里面。同一種可變性的不同表象意味著同一個(gè)繼承等級(jí)結(jié)構(gòu)中的具體子類。繼承應(yīng)當(dāng)被看做是封裝變化的方法,而不應(yīng)當(dāng)是被認(rèn)為從一般的對(duì)象生成特殊的對(duì)象的方法(繼承經(jīng)常被濫用)。
               2. 一種可變性不應(yīng)當(dāng)與另外一種可變性混合在一起,從具體的類圖來看,如果繼承結(jié)構(gòu)超過了兩層,那么就意味著將兩種不同的可變性混合在了一起。

                  "對(duì)可變性的封裝原則"從工程的角度說明了如何實(shí)現(xiàn)OCP.如果按照這個(gè)原則來設(shè)計(jì),那么系統(tǒng)就應(yīng)當(dāng)是遵守OCP的.

                  但是現(xiàn)實(shí)往往是殘酷的,我們不可能100%的遵守OCP,但是我們要向這個(gè)目標(biāo)來靠近.設(shè)計(jì)者要對(duì)設(shè)計(jì)的模塊對(duì)何種變化封閉做出選擇.

             

            1、英文講解:The Open-Closed Principle

            2、Critique of Bertrand Meyer's
            Object Oriented Software Construction,
            2nd Edition



            posted on 2008-04-18 11:06 gembin 閱讀(1060) 評(píng)論(1)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

            評(píng)論

            # re: 開放-封閉原則(OCP:The Open-Closed Principle) 2009-04-11 23:26 Xiaoqing

            good good


              回復(fù)  更多評(píng)論   

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(6)

            隨筆分類(440)

            隨筆檔案(378)

            文章檔案(6)

            新聞檔案(1)

            相冊(cè)

            收藏夾(9)

            Adobe

            Android

            AS3

            Blog-Links

            Build

            Design Pattern

            Eclipse

            Favorite Links

            Flickr

            Game Dev

            HBase

            Identity Management

            IT resources

            JEE

            Language

            OpenID

            OSGi

            SOA

            Version Control

            最新隨筆

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            free counters
            主站蜘蛛池模板: 浦东新区| 桦川县| 永泰县| 巴东县| 永安市| 开原市| 靖边县| 砀山县| 全州县| 郸城县| 腾冲县| 滨海县| 双流县| 香港 | 西城区| 鄂温| 寿阳县| 纳雍县| 福海县| 香格里拉县| 铁岭市| 响水县| 稷山县| 盐池县| 桂东县| 昌乐县| 乡宁县| 小金县| 苍山县| 和平区| 阳朔县| 丽水市| 绿春县| 安徽省| 鄂伦春自治旗| 巩留县| 汾阳市| 永安市| 冕宁县| 乌什县| 建湖县|