iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Software Development

邁向專業軟體工程師必修的英文課系列 第 6

Day 6 -[名詞五]Enumerated type,列舉形態

列舉應該是最常用,但又最常被忽略的資料形態了:它很直覺,開發人員可以把選項陳列在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。雖然他的類別很像,但命名上還是會和靜態類別對齊。
我個人的建議是

  1. 列舉名稱是用PascalCase,而且是單數名詞
  2. 列舉的內容是用SCREAMCASE
  3. 必要時應該要標註他的編號

看看字數還很多,就順便說一個小技巧好了。假設我們要幫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)存起來就可以了。
https://memes.tw/user-template/cd2a13f4111eaa931fec519cc7c41a8a.png

Enum真的很簡單也很好用,建議多研究一下它的使用方法。


上一篇
Day 5 -[名詞四] 類別的命名原則
下一篇
Day 7 -[名詞六] RESTful API
系列文
邁向專業軟體工程師必修的英文課30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言