Clean Code 無瑕的程式碼(三)

楊祖豪 Neil Yang
Neil’s Blog
Published in
Feb 25, 2021

函式的要點

  • 簡短
  • 只做一件事情
  • 每個函式最好只有一層抽象概念

簡短

越短越好,讓開發者可以一眼就明白,通常三到四行的長度就差不多

區塊 (Blocks) 和縮排 (Indenting)

函式不應該大到包含巢狀結構,縮排程度不應該大過一或兩層

只做一件事情

判斷函式是否做超過一件事情以上的方法就是,是否能從現有函式中抽出另一個函式

每個函式最好只有一層抽象概念

例如說:

  1. getHtml();
  2. pagePath();
  3. append(‘\n’)

這三種分別代表不同層次,如果將這三個功能寫在一起,會令人困惑

一個函式擁有混合層次的抽象概念會令人困惑

降層準則

由上而下閱讀程式碼,每個段落描述著目前所處的抽象層次,並提及了接續的下個層次的 TO 段落

最大的目的放在最上面,然後層層拆解,越往下越小

為了 (TO) 要包含設定及拆解,我們先納入設定,再納入測試頁的內容,最後納入拆解。
為了要納入這些設定值,如果是套件的話,我們會納入套件設定步驟,然後再引入一般的設定步驟。
為了要納入套件設定,我們先搜尋『SuiteSetup』頁面的上層,然後加入納入該頁面路徑的敘述。
為了要搜尋上一層…

使用具描述能力的名稱

看到名稱後與所想的功能差不多

函式的參數

最理想的參數數量是零個,再來是一個,然後是兩個

參數越多代表選擇越多,會使測試的難度上升許多

旗標參數 (flag)

以傳入布林值當作參數的 function,不推薦使用此作法,表明著這個 function 就不是單一作用,當 true 時一個作用,當 false 時另一個作用

物件型態的參數

Function (object) {}

動詞和關鍵字

write (name)

這樣的命名可以清楚表達意思,也可以變成 writeField 寫入欄位的意思,更能清楚表達

要無副作用

其實就是函式只做一件事

指令和查詢的分離

  1. set(username)
  2. If (set(username))

這樣會讓人混淆 set 不知道是名詞還是動詞

錯誤處理

使用例外處理取代回傳錯誤碼

例外處理

try {
deletePage(page)
Registry.deleteReference(page.name)
} catch (exception e) {
console.log(e)
}

回傳錯誤碼

這就是回傳錯誤碼,如果都使用這樣的方式來進行錯誤處理,會使得錯誤處理的函示,變得很深層的巢狀結構

deletePage(page) === ‘error’

--

--