2013年11月12日 星期二

Design Pattern - 6大設計原則

單一職責原則(Single Responsibility Principle)

  • 定義
    • There should never be more than one reason for a class to change
    • 應該有且僅有一個原因引起類別的變更
  • 好處
    • 類別的複雜性降低,實現什麼職責都有清晰明確的定義
    • 可讀性提升。複雜性降低,可讀性當然提升
    • 可維護性提升
    • 變更引起的風險降低

里氏替換原則

  • 繼承
    • 優點
      • 程式碼共享,減少創建類別的工作量,每個子類別都擁有父類別的方法和屬性
      • 提升程式碼的重用性
      • 子類別可以形似父類別,但又異於父類別
      • 提升程式碼的可擴展性
      • 提升產品或專案的開放性
    • 缺點
      • 繼承是侵入性的,只要繼承就必須擁有父類別的所有屬性和方法
      • 降低程式碼的靈活性。子類別必須擁有父類別的屬性和方法,讓子類別自由的世界多了些約束
      • 增強了耦和性。當父類別的常數、變數和方法被修改時,必需要考慮子類別的修改,而且在缺乏規範的環境下,這種修改可能會帶來非常糟糕的結果﹣大量的程式碼需要重構
  • 定義
    • If for eachobject p1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T
      如果對每一個型別為S的物件o1,都有型別為T的物件o2,使得以T定義的所有程式P在所有的物件o1都替換成o2時,程式P的行為沒有發生變化,那麼型別S就是型別T的子型別
    • Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it
      所有參照基礎類別的地方必須能透明地使用其衍生類別的物件
  • 含義
    1. 子類別必須完全實作父類別的方法
    2. 子類別可以有自已的個性
    3. 覆寫或實作父類別的方法時輸入參數可以被放大
    4. 覆寫或實作父類別的方法時輸出結果可以被縮小

倚賴倒置原則(Dependence Inversion Principle,DIP)

  • 定義
    • High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should not depend upon abstractions.
    • 高層模組不應讓倚賴低層模組,兩者都應該倚賴其抽象
    • 抽象不應該倚賴細節
    • 細節應該倚賴抽象
  • 倚賴的三種寫法
    1. 構造函式傳遞倚賴物件
    2. Setter方法傳遞倚賴物件
    3. 介面聲明倚賴物件

沒有留言:

張貼留言