命名不只是選字,還牽涉到詞性與上下文兩件事。類別與物件是「東西」,名字該用名詞或名詞片語;方法是「動作」,名字該用動詞或動詞片語。一個過於單薄的變數,只要放進命名得當的類別或函式裡,就能從周圍拿到意義——但同一份上下文一旦被重複寫進每個成員名,就成了贅字。
🧠 Why It Matters
- 詞性對齊語意,讀者不用重新解析:類別(Class)與物件(Object)用名詞或名詞片語(
Account、AddressParser),方法(Method)用動詞或動詞片語(getSpeed、deletePage、save)。詞性一旦對上概念,讀者掃過名字就知道它是「東西」還是「動作」,不必停下來翻譯。 - 上下文能替單薄的名字補足意義:一個名字若本身太簡單、看不出所屬,可以把它放進命名得當的類別或函式裡,讓周圍替它說話。
speed單獨看語焉不詳,但放在Car類別裡就清楚是「車速」——上下文做了名字沒做完的事。 - 多餘的上下文是反向的雜訊:一旦所屬已經由類別講清楚,再把類別名塞進每個成員名就是重複。
CarInfo裡的car_speed、get_car_speed,那個car_前綴讀者早就從類別知道了,多寫一次只是拉長名字、稀釋重點。 - 這是「加對」與「去掉多餘」的一體兩面:加有意義的上下文,去無謂的上下文,兩者判斷的是同一件事——這個資訊到底該由名字承擔,還是周圍已經替它承擔了。
⚖️ Case Study
前 — 詞性錯位、上下文重複
// 類別名混進動詞感、成員又重複 car_ 前綴
class CarInfo {
constructor() {
this.car_speed = 0;
this.car_color = "black";
}
// 方法名塞進類別名,car_ 是贅字
get_car_speed() {
return this.car_speed;
}
}類別已經叫 Car…,car_speed、get_car_speed 裡的 car_ 讀者早就知道;前綴沒帶來新資訊,只是把每個名字拉長、讓真正的重點(speed)被稀釋。
後 — 名詞類別、動詞方法、上下文交給類別
// 類別用名詞;成員靠類別提供上下文,不再重複前綴
class Car {
constructor() {
this.speed = 0;
this.color = "black";
}
// 方法用動詞片語;讀者已知這是 Car 的方法
getSpeed() {
return this.speed;
}
}類別名 Car 是名詞、方法 getSpeed 是動詞片語,詞性各就各位;speed 從類別拿到「車速」的上下文,於是 car_ 前綴可以整批拿掉——意義沒少,名字更乾淨。
TIP
判斷 car_ 該不該留,問一句:「讀者在這裡還不知道這是 Car 嗎?」在 Car 類別內,答案是「已經知道」,前綴就是贅字;若這個 speed 是漂在某個大函式裡、看不出所屬,那才需要用名字或外層結構補上上下文。
🔑 Takeaways
- 詞性對齊語意:類別/物件用名詞或名詞片語,方法用動詞或動詞片語。
- 名字太單薄時,把它放進命名得當的類別或函式,讓上下文替它補足意義(
speed在Car裡就清楚)。 - 上下文一旦由類別講清楚,就別再重複寫進每個成員名——
Car內的car_前綴是贅字。 - 「加有意義的上下文」與「去多餘的上下文」是同一判斷:這資訊該由名字承擔,還是周圍已承擔?
- 詞性一致與一致性相輔相成;名字該多長則見名稱長度與作用域。
No notes yet — jot your takeaways or Q&A here.