有意義的命名:讓意圖自明

★★★★Draft

From無瑕的程式碼(Clean Code)

📚 From the Books

有意義的命名:讓意圖自明整潔程式碼

命名不只是給變數一個代號,它是可讀性的第一道防線。一個好名字能回答三個問題:這東西為什麼存在?它做什麼?該怎麼用?當名字本身就把意圖說清楚,讀者就不必再靠註解或猜測去補完——因為程式碼主要是寫給「人」看的,其次才是給機器執行。

🧠 Core Ideas

TIP

現代 IDE 會顯示型別、用顏色區分成員變數,所以匈牙利式的型別編碼(stri_)、成員前綴 m_、介面前綴 I 大多已是純視覺雜訊。把裝飾拿掉,讓名字專注在「它是什麼」而非「它是什麼型別」。

⚖️ 為什麼壞名字的代價會被放大

命名看似小事,但因為程式碼被讀的次數遠多於被寫,任何讓名字難懂的捷徑,都會在後續每一次閱讀時重複收費。

三種常見的命名陷阱
  • 無意義的序列命名a1, a2, ... aN 這種數列命名完全不提供任何線索,讀者只能回頭去讀實作才能猜出用途——等於把命名該做的工作推給了每一位讀者。

  • 贅字與重複上下文。在 Car 類別裡把方法叫 getCarSpeedcar 是多餘的——讀者已經知道這是 Car 的方法。移除贅字後 getSpeed 反而更清楚。

  • 相似到無法區分的名字。當兩個名字語意幾乎沒差(ProductInfo vs ProductData),讀者無法從名字判斷該用哪一個,只好回去讀原始碼——命名的價值就此歸零。

🖼️ 命名是降低認知負擔的工程手段

Uncle Bob 把命名放在《Clean Code》全書第二章、緊接在「什麼是整潔程式碼」之後,不是偶然:在他的體系裡,好命名是「意圖自明」最直接的實現。書中特別區分兩種術語領域——面向工程師的 Solution Domain 使用演算法與設計模式的詞彙(UserBufferOrderObserver),面向領域專家的 Problem Domain 使用業務語言(EscrowLedgerClaimVoucher)。選對領域,等於確保技術實現與商業需求對齊,讓不同背景的讀者都能無痛理解。

命名還牽動詞性的一致:類別與物件用名詞或名詞片語,方法用動詞或動詞片語。這些規則的共同目的只有一個——把讀者「翻譯」程式碼的認知成本降到最低。當每個名字都精準對應到讀者腦中的既有概念,程式碼就能像文章一樣被順讀,而不是像密碼一樣被解碼。

IMPORTANT

好命名的最終判準不是「漂亮」,而是「讀的人不需要猜」。當你發現自己想寫註解解釋一個變數是什麼,先問:能不能改個名字讓註解變得多餘?多數時候答案是可以——這也是為什麼《Clean Code》說註解往往是一種失敗的補償。

🔑 Takeaways

✍️ My Notes

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

📖 Further Reading