列舉應該是最常用,但又最常被忽略的資料形態了:它很直覺,開發人員可以把選項陳列在Enum type裡,它很安全,基本上很難超出限制的範圍,它很方便,開發人員可以很快的知道有那些選項要處理。它也很好寫,就跟一般的類別型態一樣,而且所有語言的語法都差不多。
import enum
class UserRight(enum.Enum):
Read = 1
Write = 2
All = 3
只要是在有限的選項操作,例如會員種類啊,遊戲種類啊,安全等級啊,付款方式啊...等等,大多數的情況列舉都可以處理,在選項改變時也比較容易發現或者搜尋到應該調整的地方。
不過他有一個缺點:就是Enum沒辦法在Runtime的時候增減選項,而且Enum的選項是有大小寫區分的,因此
Color.Red
和
Color.RED
是不同的。
因為Enum具備靜態類別(Static Type)的特性:啟始時載入,密封(Sealed),無法產生新的instance。雖然他的類別很像,但命名上還是會和靜態類別對齊。
我個人的建議是
看看字數還很多,就順便說一個小技巧好了。假設我們要幫Sʌbw@y一個點餐系統,裡面總共有五種料,他的enum type是Cheese, Ham, Black Olivers, Lettuce, cucumber。
那我的
enum AddOn
{
CHEESE,
HAM,
BLACKOLIVERS,
LETTUCE,
CUCUMBERS
}
我現在要加三種料,分別是Cheese, Ham還有Cucumbers,這時候我要怎麼處理比較好?
比較直接的做法,就是在資料庫裡直接拉五個欄位,表示這五種料,如果有增加,再依序再往後加新的欄位。
不過更好的做法,是用二進位操作來管理enum的選項,怎麼做呢?
首先,以二為底賦值給每個選項:
enum AddOn
{
CHEESE = 1, //2^0 = 00001
HAM = 2, //2^1 = 00010
BLACKOLIVERS = 4, //2^2 = 00100
LETTUCE = 8, //2^3 = 01000
CUCUMBERS = 16 //2^4 = 10000
}
如此一來,就可以透過位元操作,就可以知道那些選項己經被選中。例如Addon = 28,它的二進位值是11100,表示Black Olivers, Lettuce還有Cucumbers被選中。如果是要選擇Cheese, Ham還有Cucumbers,就是把Addon.CHEESE, Addon.HAM以及Addon.CUCUMBERS的值相加(1+2+16=19)存起來就可以了。
Enum真的很簡單也很好用,建議多研究一下它的使用方法。