物件導向軟體設計的“開—閉”原則

來源:互聯網
上載者:User

1.什麼是開閉原則
        “開—閉”原則是指軟體實體應當對擴充性開放,對修改關閉。即軟體實體應該在不修改的前提下擴充,這個原則實際上為軟體設計指明了目標。我們知道軟體設計應當充分考慮軟體的可維護性,即需求發生變化的時候軟體結構能夠靈活地適應這種變化。就評價軟體的可維護性而言,“開—閉”原則提供了一個依據。實際上,設計模式的應用就是使軟體的結構在某種程度上滿足“開—閉”原則。

2.“開—閉”原則的實現
      “開—閉”原則為設計提供了目標,但卻沒有明確給出實現的手段,下面說明在物件導向的設計中實現“開—閉”原則的方法。
   (1)面向介面的編程
   面向介面的編程的優勢如下:
   a.降低程式各部分之間的耦合性,使程式模組互換成為可能。這樣客戶無需知道自己使用的對象的類型,只要對象有客戶所期望的介面即可。並且客戶也不需要知道對象是如何?的,只要知道定義介面的抽象類別。
   b.使軟體各部分便於單元測試,通過編製與介面一致的類比類(Mock),可以很容易地實現軟體各部分的單元測試。從而提高軟體的可靠性,降低錯誤率。
   c.已於實現軟體的模組的呼喚,軟體升級時可以只部署發生變化的部分,而不會影響其它部分。
對於設計模式來說,建立型模式的產生是面向介面編程的必然結果,面向介面編程要求使用對象的客戶不瞭解對象的具體類型,客戶只能通過一個負責執行個體化對象的對象——我們稱之為“工廠”——來執行個體化對象,而工廠對象在應用初始化時集中進行執行個體化或者在集中的模組中進行。

3.封裝變化
        程式中任何可能發生變化的部分都可以封裝為對象,包括命令、事件、屬性、演算法和狀態等。封裝變化是實現“開—閉”原則的重要手段,也是在設計中發現對象的重要途徑。因此在分析需求時,一定要注意什麼是不變的,什麼是可能發生變化的,以及這些可能的變化會對封裝帶來的影響。
例如,如果對象的行為基本不變,那麼這些行為可以作為對象的方法;否則就要考慮是否抽象和封裝這些行為。再如,狀態可以用狀態參數來表示,例如溫度和壓力等。可以將狀態參數作為獨立的屬性,但如果狀態參數之間相互關聯,則有必要進行抽象。
        總之,封裝可能發生變化的部分,將可能的變化作為對象。在物件導向設計中,對象不僅是指現實中存在的事物或者可視的事物,任何可能變化的部分都是侯選對象。

4.採用組合替代繼承
         繼承是物件導向系統的特點之一,沒有繼承,很多物件導向的設計就無從談起。在設計模式中,沒有哪個模式不涉及到繼承。採用組合替代繼承並不適合任何情況,實際上,如果沒有繼承,很多組合根本無法實現,涉及到基礎結構的繼承無法替換。
        組合和繼承針對模組中的複用而言,當功能需要擴充時,採用繼承實現複用比較簡單直觀。只要派生一個類,在這個類中增加新的特性,即可實現對現有類複用。然而類繼承在編譯時間定義,無法在運行時改變 。並且繼承對子類暴露了父類的實現細節,從而破壞了封裝性,使子類與父類別結合程度性非常強。一旦父類發生變化,必然導致子類也發生變化。如果繼承下來的實現不能解決新問題,則需要修改父類,這種依賴性限制了靈活性。
如果我們希望通過增加子類來擴充功能,可能會出現的情況。   
                                                 

        如果不修改類而僅僅依靠增加子類擴充,儘管似乎滿足“開—閉”原則,但結果變得非常可笑。替換這個方案的一種方法是採用對象組合,將人的行為抽象為類,。
                                  

通過與行為對象的組合,可以擴充“人”的行為。通過增加新的行為類來實現擴充,類層次並沒有增加。
          對象組合在運行時通過獲得對其他對象的引用來實現,組合要求對象遵守彼此的介面約定。只要符合這個約定,一個對象可以在運行時動態地瑋不同的對象組合,從而實現複用。在設計時,每一部分只要關注介面約定即可,不必考慮具體的實現。因此對象組合有最小的耦合性並且更靈活,在設計模式中大量地採用了對象組合。
        再次強調,繼承是物件導向的基石之一。採用組合代替繼承者是在需要複用的前提下,並不是所有的繼承都可以用組合替代。不僅如此,沒有繼承,組合也無從談起。在上面的例子中,行為的擴充仍然需要增加行為子類。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.