一致性是把命名從「每次都要重新判斷」變成「一次學會、到處套用」。當某個概念在整個程式裡永遠叫同一個名字、而那個名字也永遠只指這件事,讀者在一處學到的知識就能安全地帶到每一處——這正是降低認知負荷最便宜的方法。
🧠 Why It Matters
- 一致性讓知識可重用:讀者在某個情境學會
fileBlock的意思後,在別的情境看到它立刻能套用,就像重用一個通用類別。 - 一詞一概念:別讓
controller、manager、driver同時代表類似的東西,否則沒人分得清DeviceManager與ProtocolController的本質差別。選一個詞,貫徹到底。 - 一致性的三個要求(APoSD):① 對指定用途永遠用約定名稱;② 該名稱永遠不用於別的用途;③ 該用途夠窄,使所有同名變數行為一致。第三點正是
blockbug 違反的——同一個名字有兩種行為。 - 慣例的價值在於「存在」本身:Code Complete 指出,命名慣例真正的好處不在選了哪套規則,而在有規則——它減少局部決策、讓知識在專案間轉移、避免同概念出現多名(
pointTotal與totalPoints並存)。
NOTE
詞性也要一致:類別/物件用名詞或名詞片語,方法用動詞或動詞片語。存取器統一用 get/set 前綴。這些小約定累積起來,就是「不用想」的順暢。
⚖️ Case Study
前 — 同一概念,三種叫法
// fetch / get / retrieve / load 混用,讀者被迫猜它們是不是不一樣
class UserRepository {
fetchUser(id) {
/* ... */
}
getProfile(id) {
/* ... */
}
retrieveSettings(id) {
/* ... */
}
loadHistory(id) {
/* ... */
}
}四個方法做同一件事(依 id 取資料),卻用四個動詞。每次呼叫都得停下來想「這個跟那個有差嗎」。
後 — 一個概念一個詞
// 統一用 get;同類多參數用「約定名 + 區分前綴」
class UserRepository {
getUser(id) {
/* ... */
}
getProfile(id) {
/* ... */
}
getSettings(id) {
/* ... */
}
getHistory(id) {
/* ... */
}
// 需要來源與目的地兩個 block 時:srcFileBlock / dstFileBlock
copyBlock(srcFileBlock, dstFileBlock) {
/* ... */
}
}動詞統一成 get,讀者不再需要猜差異;當同類變數有多個(來源/目的地),用約定名加 src/dst 前綴,而不是另立新詞。
TIP
對稱詞組能強化一致性:begin/end、first/last、min/max、next/previous、old/new、source/target。成對出現的概念用成對的詞,讀者的預期就不會落空。迴圈短名也一樣——永遠 i 在最外層、j 在次外層。
🔑 Takeaways
- 一致性讓「一處學會的名字」能安全套用到所有地方,是最便宜的降認知負荷手段。
- 一詞一概念:同一件事永遠用同一個詞(別
fetch/get/retrieve混用)。 - 一致性三要求:約定名只用於該用途、該用途夠窄使行為一致——違反第三點就會重演
blockbug。 - 命名慣例的價值在於「有慣例」本身;詞性、存取器前綴、對稱詞組都要一致。
- 同類多變數用「約定名 + 區分前綴」(
srcFileBlock/dstFileBlock),而非另造新詞。
No notes yet — jot your takeaways or Q&A here.