避免誤導 (Avoid Disinformation)

★★★★Draft

FromAPoSDClean CodeCode Complete

📚 From the Books

避免誤導 (Avoid Disinformation)Naming

一個「還算貼切」的名字,可能比明顯很爛的名字更危險——因為它會讓每個讀者反射式地做出錯誤假設,卻不自覺。命名的下限不是「別取爛名」,而是別留下會誤導的線索

🧠 Why It's a Problem

CAUTION

紅旗:模糊名稱(Vague Name)。 當一個變數或方法名廣泛到能指多種東西,它就沒提供有用資訊,而且更容易被誤用。getCount() 數什麼?xy 是字元位置還是像素座標?換成 numActiveIndexletscharIndex 這種對應到實際抽象的名字。

⚖️ Case Study

一個名字追了六個月

APoSD 作者在 Sprite 作業系統裡遇過最棘手的 bug——檔案偶爾莫名其妙丟資料、某個區塊突然全變 0。多位開發者讀過那段程式碼都沒發現,他自己花了六個月

病因 — 一個名字身兼兩義
// block 有時裝「檔案內的邏輯區塊號」,有時裝「磁碟上的實體區塊號」
// 某處把持有邏輯區塊號的 block,誤用在需要實體區塊號的地方
function writeBlock(block, data) {
  disk.write(block, data); // 期待實體區塊號,卻拿到邏輯區塊號 → 覆寫掉無關磁碟區塊
}

block 對「實體區塊」與「邏輯區塊」都算貼切——正因如此,讀到它的人都反射式假設「這就是實體區塊號」,形成心智阻擋(mental block),沒人起疑。

解法 — 讓名字自己擋掉誤用
// 兩種概念、兩個名字:開發者一眼就知道 fileBlock 不能用在這裡
function writeBlock(diskBlock, data) {
  disk.write(diskBlock, data);
}

// 呼叫端若手上是 fileBlock,型別對不上意圖,錯誤在寫的當下就顯眼

fileBlockdiskBlock,這個 bug 幾乎不可能發生——開發者不會把 fileBlock 餵給需要 diskBlock 的地方。

IMPORTANT

教訓:多數人挑「第一個還算貼切」的名字就停手。block 不是爛名字,卻害人追了六個月。不要止步於「還算貼切」,多花幾分鐘找精確、無歧義、直覺的名字——這份投入很快回本。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading