iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 12
0
Software Development

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

Day12 - [代名詞四] Magic Numbers

是否有人有一樣的經驗,看別人的程式時,突然蹦出一個數字,例如
https://ithelp.ithome.com.tw/upload/images/20200913/20111458e7QNLM67QR.png
然後完全不知道這個東西是什麼。
這就是Magic Numbers,一個讓所有開發人員都會中斷思路的一個神祕數字。其實這個還滿常見的,特別是為了客制某些流程時,或者限制某些條件使用時,就會出現Magic Numbers,例如:

  • 最常見的:Connection String
  • 限制時間在3600秒完成
  • 要連接Port 8080
  • API KEY是"60d77b84-6f00-4ffa-9ebc-c37c54f5c2e3"
    其實可以這麼說,雖然名字上是叫「Magic Numbers」,但只要程式裡有突然出現的文字、數字,然後必需要另外註解說明這個不速之客是那裡來的,為什麼是這個數值,要看那份文件,就會歸類在Magic numbers。

理論上Magic numbers是一種Constant,所以把他做為常數做管理就可以了,以上面的例子來看,就會寫成

    const int LIMIT_TIME = 3600;
    const int PORT 8080;
    const string API_KEY = "60d77b84-6f00-4ffa-9ebc-c37c54f5c2e3";
    ....
    ....
    server.SetCredentials(API_KEY, PORT);
    server.SetTimeout(LIMIT_TIME);

這樣不但可以確認每個輸入值的意思,還可以確保放置的位置是正確的。對整體程式的可讀性會大大的增加。盡可能讓程式不要出現Magic Numbers,把所有寫死的參數變成變數甚至是常數,對於未來如何管理這些資料會增加很多彈性。

另外一件事是:如果Magic Numbers是透過運算出來的值(例如時間),最好還是保留他的運算方法在常數上,最常見的就是3600秒這種數字(60分鐘*60秒)。

把Magic Numbers常數化的例子很多,例如integer的最大/最小值,在C#就是包成constant
https://ithelp.ithome.com.tw/upload/images/20200913/20111458IT8Dp2GDEW.png

雖然Magic Numbers大多都是包成Constant,但實務上還是有一些不同的做法,例如:
1.放在設定檔裡,這是最常見的作法,像Connection String就會這樣做。
2.集中放在一個靜態常數類別裡,我還滿喜歡這種做法的,可以在一個地方直接管理所有的常數。
3.變成一個Enum,其實就是上面的方法變型而己,不同的地方在於放在類別的話,可以支援任何的資料型態,但放在Enum裡,可以支援的型態就比較少了(基本上就是文字還數字)。

其實Magic Numbers並不是一個什麼很特別的東西,但也就是這種小細節,會讓整個程式的可讀性提昇很多,如果在開發期間有看到類似的參數,不妨試著把他變成變數或常數,或者觀察看看自己正在做的專案裡有沒有Magic Numbers?怎麼做才會提昇可讀性呢?


上一篇
Day11 - [代名詞三] 參數
下一篇
Day 13 - [動詞一] 方法命名
系列文
邁向專業軟體工程師必修的英文課30

尚未有邦友留言

立即登入留言