iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 14
0
自我挑戰組

Framework 設計原則系列 第 14

Member Design(3) - Constructor

  • 分享至 

  • xImage
  •  

今天介紹的是建構子的設計原則

建構子分為兩類:

  • Instance constructors
  • Type constructors

範例如下

pulbic class Customer{
    // instance constructor
    public Customer(){...}
    
    // type constuctor
    static Customer(){...}
}

我們常見常用的幾乎都是instance constructor

只有在type被建立時才會去呼叫他

而type constuctor則是在一開始就會呼叫

之前常說的default constuctor(預設建構子)則是不帶任何參數的建構子

以下逐條說明設計時的注意事項

1.提供簡單,明確預設的建構子

所謂簡單的建構子,只傳入幾個重要的參數,並且都是int, string...這種簡單的形態,或是Enums

2.建構子可以作為main properties的捷徑

var applicationLog = new EventLog();
applicationLog.MachineNmae = "BillingServer";
applicationLog.Log = "Application";

// 用建構子做捷徑
var applicationLog = new EventLog("BillingServer","Application");

3.在建構子中指定property的值時,用一樣的名稱代表同一個property

這也是為什麼參數要用casmel casing,用來避免名稱重複且易於區別

public class EventLog{
    public EventLog(string logName){
        this.LogName = logName;
    }
    
    public string LogName{get;set;}
}

4.不要在建構子中做複雜的事

5.instance constructor中如果發生錯誤,視情況丟出exception
並且在cache的地方加上finaly{Dispose(false);}

因為當執行到instance constructor表示物件已經產生
如果丟出Exception卻不處理他,可能會OutOfMemoryException
如果不丟出Exception,必須GC.SupperssFinalize(this);去回收以產生的物件

public FinalizableType(){
    try{
        ...
    }cache(Exception e){
        GC.SupperssFinalize(this);
        throw;
    }
}

6.必要時明確的寫出defualt constructor
不宣告任何constructor時,會自動幫你加上一個defualt constructor

public class Customer{

}

public class Customer{
    public Customer(){}
}

但是一旦宣告一個有帶參數的運算子,那個Type就會失去defualt constructor
必須要明確宣告一個defualt constructor才有

7.struct不要宣告defualt constructor

8.避免在建構子中呼叫virtural member(可以被實作的member)

Type Constructor設計原則

1.static constructor宣告為private

2.不要從static constructor丟出Exception

否則將無法在使用這個Type


上一篇
Member 設計原則(2) - Property
下一篇
Member設計原則(4) - Event
系列文
Framework 設計原則30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言