iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 6
0
Modern Web

Ruby礦工的Rails地圖系列 第 6

Don't use Magic number in your code

用英文寫標題感覺很厲害,不過臨時決定寫這個題目
是因為原本要寫的包gem卡關,需要更多時間摸索
只好拉一個不一樣的主題來寫

一開始知道這個觀念是從「Clean Code」看到的
台灣翻譯的書名叫做「無瑕的程式碼」,由Robert C. Martin所編寫
後來在職場上也有被前輩指點同一個地方,所以印象非常深刻

Magic number如果直接翻譯是「魔術數字」
泛指在程式裡如果沒有註解就無法明白本身意涵的數字
新手很容易寫下類似這樣的程式碼

#當使用者為管理員時,...
if role == 1
    #...略
end

看起來沒有問題,而且運作無誤
畢竟,這確實符合文法,但是在寫作習慣上,是不好的風格
因為隨著專案年齡增長,類似這樣的判斷會遍佈專案各處
註解通常是最容易被忽略更新的地方
老鳥離職、新手接任
就必須用猜的才能知道那些數字天殺的到底代表什麼
我想這也是Magic number名稱的由來
當你不知為何的時候,一切看起來就像是魔術

第二個不該這麼寫的原因,是當規則變動時
你很難在所有專案裡面搜尋那個數字,因為數字不是個好的搜尋標的
所以很有可能改了99處,偏偏漏了一處
而忘記的那個地方就會成為新的bug
這類型的bug相當頻繁出現,屬於成長的陣痛
就算是大公司的大專案,有時也可以看見屬於這類型的bug(不如說正是因為大專案,特別容易出現)

有鑑於此,比較好的做法是用一個方法包覆數字
這樣專案的所有地方需要判斷,都是統一使用方法
未來如果需要變更,只要修改該方法即可
例如:

def is_admin?
    role == 1
end

def foo
    if is_admin?
        #...
    else
        #...
    end
end

這不僅只是rails,其實各種語言都應該遵守這種寫作風格
是避免產生未來的bug的好方式

這還會產生一個額外的優點,就是程式的語意化程度提升
讓人一眼可以得知程式的意圖
一個工程師可能很難知道role == 1代表什麼
但是看見is_admin?可以直接明白這是判斷是否為管理員
反向的判斷可能寫成is_not_admin?
這樣的寫法,就不需要在加上註解「假如是管理員...」
因為與程式碼if is_admin? 幾乎沒有差別

在clean code裡面還有提倡一個概念
好的程式碼不需要註解,好的程式碼本身就是文件
應該清楚地解釋意圖
畢竟程式是按照code在運作而不是註解運作
況且工程師都不是很勤勞的更新註解,反而容易造成誤導

有興趣的朋友強力推薦把那本書買回家研讀
會收穫良多,今天就介紹到這邊~!


上一篇
如何自行編寫Ruby的方法
下一篇
Top 10 common mistake for junior rails developer (1~5)
系列文
Ruby礦工的Rails地圖30

尚未有邦友留言

立即登入留言