2015年10月15日 星期四

[ 設計原則 ] - 開放封閉原則(OCP,Open-Closed Principle)

 開放封閉原則(OCP,Open-Closed Principle),光從名稱來看的話,這個其實是相當矛盾的一種原則,要怎麼又開放,又封閉呢?其實這個更具體的來說是要「開放擴充」、「封閉修改」,例如我們寫了一個服務,這個服務他提供了MS-SQL的資料提供,這個時候公司下一個案子進來了,客戶是用Oracle資料庫時,我們如果去修改了原始提供服務的類別,那麼就違背了這個原則,那我們應該怎麼做呢?我們應該為資料提供類別取出抽象的介面,而資料的提供都依賴這個介面,如此一來,我們就可以輕鬆的替換原始的邏輯了。




  定義:Software entities should be open forextension,but closed formodification.
     (軟體實體應該是對擴充開放,但是修改關閉)

  如何實現:
    在設計上應該要使用抽象的介面,透過介面的行為來組成我們的商業邏輯。

    這樣的設計,配合Dependency Injection,未來不管在那麼不管需求的內容如何變化,都可以因為改變注入的內容,而不用修改場景類別,以滿足OCP原則。



    上圖場景中,BusinessClass他依賴於IDao,並沒有直接的去依賴MySqlDao及MySqlDao,如此一來,當在呼叫BusinessClass.CRUD()時,我們可以先透過注入不同的的Dao類型,去滿實足同的實作結果,未來在需要擴充時,也可以延伸出OracleDao、SqliteDao...等不同的類型,透過這些不同類別的實作,可以去改變BusinessClass的行為內容,但是對BusinessClass本身而言是不需要修改的,這便是OCP的精神。


本文參考引用:
[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day17 – 單一職責原則

沒有留言:

張貼留言