名字該多長?答案不是固定的,而是跟著作用域走:一個變數活得越久、走得越遠,讀者能從上下文推出它的機會就越小,名字就得越具描述性。作用域小到幾行內看得完,
i就夠了;跨越整個模組,就得把意義寫進名字。
🧠 Why It Matters
- 長度與作用域成正比:Code Complete 的研究指出,變數名平均 10–16 字元時除錯心力最低。但這是通則——短名適合作用域極小的區域/迴圈變數,長名適合全域或不常用的變數。
- 短名在短作用域是對的:
for (i = 0; i < numLines; i++)裡的i完全沒問題,因為它的所有用途都在眼前、意義從程式碼就推得出來。硬把它改成lineIndex反而囉嗦。 - 短名在長作用域會出事:一旦迴圈長到看不完整段、或迭代變數意義不直觀,就換描述性名字。巢狀迴圈用
score[teamIndex][eventIndex]遠比score[i][j]安全,能避免索引交叉錯誤。 - 可搜尋性:單字母名與魔術數字在大型專案裡幾乎無法精確定位。
MAX_CLASSES_PER_STUDENT = 7既可搜尋又自帶語意,7兩者皆無。 - 很少需要縮寫:現代語言幾乎沒有名稱長度限制,刻意省一個字元換來的可讀性損失並不划算。
TIP
Code Complete 的「電話測試」:如果你沒辦法在電話裡把程式碼唸給同事聽,名字就取壞了。用 xPos 而非 xPstn——名字必須唸得出來。
⚖️ Case Study
前 — 作用域大卻用短名,還埋了魔術數字
function f(d) {
let r = 0;
for (const x of d) {
if (x.t > 30) r += x.v * 0.07; // 30?0.07?搜尋 "0.07" 撈到一堆無關結果
}
return r;
}f、d、r、x 全是跨越整個函式的作用域卻用單字母;30 與 0.07 是無法搜尋、無語意的魔術數字。
後 — 長度配合作用域,常數具名可搜尋
const OVERDUE_DAYS = 30;
const LATE_FEE_RATE = 0.07;
function totalLateFees(invoices) {
let feesTotal = 0;
for (const invoice of invoices) {
if (invoice.daysOverdue > OVERDUE_DAYS) {
feesTotal += invoice.amount * LATE_FEE_RATE;
}
}
return feesTotal;
}跨函式作用域的變數拿到描述性名字;魔術數字換成可搜尋的具名常數。注意迴圈內若要短名,invoice 這種一眼可懂的仍優於 x。
WARNING
計算值限定詞(Total、Count、Sum、Average、Index)放在名字末尾且全專案一致:revenueTotal、expenseAverage。特別小心 Num——numCustomers(總數)與 customerNum(索引)語意相反,建議改用 Count/Total 表總數、Index 表索引。
🔑 Takeaways
- 名字長度跟著作用域走:短作用域可短名,長作用域要描述性名字。
i/j在看得完的短迴圈裡沒問題;巢狀或長迴圈換成teamIndex/eventIndex這類名字避免索引錯亂。- 魔術數字換成可搜尋的具名常數,兼得語意與可定位性。
- 通過「電話測試」——唸不出來的名字就是壞名字。
- 限定詞(Total/Index)放末尾且一致;
Num有歧義,改用Count/Index。
No notes yet — jot your takeaways or Q&A here.