[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
- 繼承自System.Web.UI.Page
 - 頁面的super class
 - 可自訂function , property跟event(搭配頁面生命週期做變化)
 - Class Diagram:       

 - 統一處理共同的資訊,如
- Global logger
 - 存取設定檔或Resource檔,例如Message多國語言
 - 註冊JavaScript的function
 - 每一個繼承BasePage子頁面都需要的畫面處理
 
 - Global logger
 - 與MasterPage的差異      
- focus           
MasterPage:處理的共同property與function,都是focus在跟MasterPage上UI有關的東西
BasePage:處理的通常是比較非UI,但每一支頁面幾乎會用到的共同function
 - 特性           
MasterPage:繼承自UserControl
BasePage:通常繼承System.Web.UI.Page (也有可能繼承於另一個自訂的BasePageX.cs) 
 - focus           
 - 同樣要注意的特點      
- 每頁都套用MasterPage或繼承BasePage,代表上面有寫的都會跑,要小心過於肥大,影響performance。單一職責原則在這邊也同樣適用。
 - 繼承就是侵入性的強耦合,繼承有的問題,在這邊使用上也有可能會出現。介面隔離原則跟依賴反轉原則,用來解耦的方式,在這邊也同樣適用。
 
 - 每頁都套用MasterPage或繼承BasePage,代表上面有寫的都會跑,要小心過於肥大,影響performance。單一職責原則在這邊也同樣適用。
 
結論        
雖然繼承是個侵入性強耦合的設計,但不要忘記前面文章所說的:[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day21 - LSP 里氏替換原則
針對違反LSP設計時可行的重構(Refactoring)方式
當Class A錯誤的繼承Class B時:
- 可建構一個新的abstract class C,作為2個concrete Class A與B的父類別,也就是多抽象一層來當兩個的父類別,讓A與B在繼承鏈中深度一樣,來避免A繼承B的強耦合與錯誤使用
 - 也可以透過委派的方式來解決(分離)A與B的錯誤繼承關係。
 
blog 與課程更新內容,請前往新站位置:http://tdd.best/
