[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day24 - BasePage

[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day24 - BasePage

前言
上一篇文章介紹了在開發系統很常會用到的UserControl與MasterPage後,接著來介紹我很常設計的一個類別: BasePage。

BasePage是我自己建的一個類別,繼承自System.Web.UI.Page,接著有需要使用到BasePage共通性的頁面,就都繼承於BasePage。

可以降低重複開發,統一修改,多墊一層super class,雖非抽象介面,但Page是一個特別的class,所以super class並不會造成太多class與class之間的問題。只有繼承鏈的強耦合問題。

Issues

  1. 繼承自System.Web.UI.Page

  2. 頁面的super class

  3. 可自訂function , property跟event(搭配頁面生命週期做變化)

  4. Class Diagram:
    BasePage

  5. 統一處理共同的資訊,如
    1. Global logger

    2. 存取設定檔或Resource檔,例如Message多國語言

    3. 註冊JavaScript的function

    4. 每一個繼承BasePage子頁面都需要的畫面處理

  6. 與MasterPage的差異
    1. focus
      MasterPage:處理的共同property與function,都是focus在跟MasterPage上UI有關的東西
      BasePage:處理的通常是比較非UI,但每一支頁面幾乎會用到的共同function

    2. 特性
      MasterPage:繼承自UserControl
      BasePage:通常繼承System.Web.UI.Page (也有可能繼承於另一個自訂的BasePageX.cs)

  7. 同樣要注意的特點
    1. 每頁都套用MasterPage或繼承BasePage,代表上面有寫的都會跑,要小心過於肥大,影響performance。單一職責原則在這邊也同樣適用。

    2. 繼承就是侵入性的強耦合,繼承有的問題,在這邊使用上也有可能會出現。介面隔離原則跟依賴反轉原則,用來解耦的方式,在這邊也同樣適用。

 

結論
雖然繼承是個侵入性強耦合的設計,但不要忘記前面文章所說的:
[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day21 - LSP 里氏替換原則

針對違反LSP設計時可行的重構(Refactoring)方式
當Class A錯誤的繼承Class B時:

  1. 可建構一個新的abstract class C,作為2個concrete Class A與B的父類別,也就是多抽象一層來當兩個的父類別,讓A與B在繼承鏈中深度一樣,來避免A繼承B的強耦合與錯誤使用
  2. 也可以透過委派的方式來解決(分離)A與B的錯誤繼承關係。

 


blog 與課程更新內容,請前往新站位置:http://tdd.best/