.

iT邦幫忙

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

Framework 設計原則系列 第 10

Types 設計原則(5) - Enum

  • 分享至 

  • xImage
  •  

本文重點

1.Enum共通設計原則
2.Flag Enum設計原則


假日是一個拖搞的開始,今天預計寫Enum的設計原則

Enum是一種特別value type

包括Simple Enums跟Flag Enums

Simple Enum代表一組提供使用者選擇的集合

例如,有一個Weekday的Enum。裡頭包括Monday ~ Sunday

public enum Weekday{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

Flag Enum是支持位元運算子(bitwise operations)的enum

像是AND,OR,NOT,XOR這些

我們有個專案用Flag Enum來做權限,範例如下

[Flags]
public enum Permission{
    None = 0,
    Read = 1,
    Create = 2,
    Edit = 4,
    Delete = 8
}

當某個登入者有多個權限時,用OR連結

Permission.Read | Permission.Create | Permission.Edit

以下分別介紹Enums的共通原則,再針對Flag Enums特別說明

Enum

  1. 用Enum當參數可以增加可讀性

  2. 用Enum取代static class

  3. Enum必須是封閉集合的組合,不是隨時會增加的東西

  4. 不要加上沒有屁用的value,也不要想說未來會用到就先加。沒用的value不要加在裡面

  5. 只有兩個value的Enum,雖然可以用Boolean取代。但是用Enum可讀性會更佳

/** 使用Boolean,可讀性差 **/
FileStream f = File.Open("foo.txt", true, false);

/** 使用Enum,可讀性高 **/
FileStream f = File.Open("foo.txt", CasingOptions.CasSensitive, FileMode.Open);

6.在Simple Enum中,提供一個0的value當預設值

public enum EventType{
    Error = 0,
    Waring,
    Information,
    ...
}

7.建議使用Int32 value
Enum中可以使用類型為 byte、sbyte、short、ushort、int、uint、long 或 ulong。
其中int32是最多語言共同擁有的類型
除非你用的是Flags Enum,而且value的數量超過32個

8.Flag Enum的名稱使用複數名詞,Simple Enum使用單數名詞

Flag Enum設計原則

1.Flag Enum的名稱使用複數名詞

2.Flag Enum使用2進位,這樣比較好用OR

[Flags]
public enum Permission{
    None = 0,
    Read = 1,
    Create = 2,
    Edit = 4,
    Delete = 8
}

3.雖然可以用OR連集,但是不要把各種不同類別的東西放在同一個Enum

/** 不好的,全部都搞再一起 **/
[Flags]
public enum BindingFlags{
    Instance,
    Static,
    
    NonPublic,
    Public
}

/** 好的,根據類別分開 **/
public enum Visibility{
    NonPublic,
    public
}

public enum MemberScope{
    Instance,
    Static
}

上一篇
Types 設計原則(4) - Interface, Struct
下一篇
Types 設計原則(6) - Refrence Type VS Value Type
系列文
Framework 設計原則30
圖片
  直播研討會

尚未有邦友留言

立即登入留言