1. 程式人生 > >學習設計模式 - 六大基本原則之開閉原則

學習設計模式 - 六大基本原則之開閉原則

裏氏替換 成對 五個 jsp 導致 業務邏輯 關聯 影響 引入

  設計模式總共有六大基本原則,統稱為SOLID (穩定)原則,分別是S-單一職責原則(Single Responsibility Principle), O-開閉原則(Open closed Principle),L-裏氏替換原則(Liskov Substitution Principle),L-迪米特法則(Law of Demeter),I-接口隔離原則(Interface Segregation Principle),D-依賴倒置原則(Dependence Invension Principle)。


O-開閉原則(Open closed Principle)

一、定義

  一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。(Software entities like classes, modules and functions should be open for extension but closed for modificatins.)

二、理解

  一個軟件實體應該盡量通過擴展來實現變化,而不是通過修改已有的代碼來實現變化。因為修改已有的代碼會引入額外的風險,可能會導致其他的模塊或功能出錯。在一個軟件的生命周期中,變化必不可少,既然如此,我們必須以積極的態度擁抱“變化”。我們需要為未來可能出現的變化作出相應的設計

三、註意事項

  開閉原則對擴展開放,對修改關閉,並不意味這不做任何修改,低層模塊的的變更,必然要有高層模塊進行耦合,否則就是一個孤立無意義的代碼片段。

  變化可以歸納為3種:

  1. 邏輯變化

  只變化一個邏輯,而不改變其他模塊。可以修改原有類中的方式來完成,前提條件是所有依賴或關聯類都按照相同的邏輯處理。

  2. 子模塊變化

  一個模塊變化,必然會對其他的模塊產生影響,特別是一個低層次的模塊變化必然引起高層次模塊的變化。因此,在通過擴展完成變化是,高層次的模塊修改是必然的。

  3. 可見視圖變化

  可見視圖是提供給客戶使用的界面,如JSP程序,Swing界面等,該部分的變化一般會引起連鎖反應。最司空見慣的就是業務耦合變化。比如,按原有需求需要展示6列,然後突然有一天需要增加1列,而且這一列需要跨N張表,處理M個邏輯才能展現出來,這樣的變化是比較恐怖的,但還是可以通過擴展來完成變化,這就需要看我們原有的設計是否靈活了。

  什麽是靈活的設計?將項目中使用某個接口的所有實現類,擴展某個類,看看是否仍可正常使用,就可以知道是否靈活使用了。


  一個項目的基本路徑應該是這樣的:項目開發、重構、測試,投產、因為,其中的重構可以對原有的設計和代碼進行修改,運維盡量減少對原有代碼的修改,保持歷史代碼的純潔性,提高系統的穩定性。

  

四、開閉原則的重要性

  開閉原則是最基礎的一個原則,其他五個原則都是它的具體形態。開閉原則是其精神領袖,其他五個原則是指導設計的工具和方法。

  1. 開閉原則對測試的影響

  單元測試通過一個方法一般需要三種方法:正常數據測試,邊界數據測試,異常拋出測試,特別重要的可能需要十幾個測試方法。如果修改一個實現方法,可能就要修改多個測試方法,這也可能會出現紕漏。所以需要通過擴展來實現業務需求變化。

  2. 開閉原則可以提高復用性

  在面向對象的設計中,所有的邏輯都是從原子邏輯組合而來的,而不是在一個類中獨立實現一個業務邏輯。如何提高復用性?縮小邏輯力度,知道一個邏輯不可在拆分為止。

  3. 開閉原則可以提高可維護性

  一款軟件投產後,維護人員的工作不僅僅是對數據進行維護,還可能要對程序進行擴展,維護人員最樂意的是就是對一個類進行擴展,而不是修改一個類。

  4. 面向對象開發的要求

  萬物皆對象,我們需要把所有的事物都抽象成對象,然後針對對象進行操作,但是萬物皆運動,有運動就有變化,有變化就要有策略去應對變化。怎樣快速應對呢?這就需要在設計之初考慮到所有可能變化的因素,然後留下接口,等待“可能”轉變為“現實"。

五、如何使用開閉原則

  1. 對擴展開放的前提是抽象約束

  抽象是對一組事物的通用描述,沒有具體的實現,也就意味著包含多種可能的變化,其具體實現可以隨需求變化而變化。

  通過接口或抽象類約束一組可能變化的行為,並且能夠對擴展開放,有三層含義:

    a. 抽象對擴展進行邊界限定,不允許出現在接口或抽象類不存在的public方法

    b. 參數類型、引用對象盡量使用抽象或接口

    c. 抽象層盡量保持穩定,一旦確定即不允許修改。

  2. 元數據(metadata)控制模塊行為

  3. 指定項目章程

  4. 封裝變化

    a.將相同的變化封裝到一個接口或抽象類中

    b.將不同的變化封裝到不同的接口或抽象類中,不應有兩個不同的變化出現在統一接口或抽象類中

    

    封裝變化,即是找出預計有變化或不穩定的點,並為這些變化點創建穩定的接口。

    23個設計模式都是從不同的角度對變化進行封裝。

學習資料:

《設計模式之禪》秦小波 著

學習設計模式 - 六大基本原則之開閉原則