Russ Pencin 一句話改變了我的工程師生涯:「Don't make objects that end with 'er'.」
當時我困惑於實例變數、類變數、類實例變數的區別,這句建議聽起來荒謬,但多年實踐證明它是物件導向設計精髓的縮影。
Manager、Controller、Processor、Loader。Order、Customer、Invoice、Shipment。「er」結尾的類通常暴露了程序化殘留:它們往往是「做某事的工具」,而非「領域實體」。
| 原「er」類 | 問題 | 重構為 | 收益 |
|---|---|---|---|
| Manager | 職責模糊:註冊表?日誌?工廠? | Registry / EventLog / Factory | 職責單一、意圖顯性 |
| Controller | MVC 中 Controller 本質是什麼? | 請求路由器 / 應用服務 / 用例協調器 | 邊界清晰、可測試 |
| Organizer | 關注「如何組織」而非「是什麼」 | Agenda / Schedule / Collection | 數據結構顯性化 |
| Analyzer / Renderer | 「勞動者」角色,行為為主 | Report / Document / ViewModel | 產出物為中心 |
| Builder / Loader / Reader / Writer | 焦點在操作,而非被操作對象 | Configuration / DataSet / Document / OutputStream | 資源/數據實體化 |
Register(登記冊)、Border(邊框)、Character(字符)、Number(數字)。Compiler、Interpreter、Browser、Servlet——已成領域術語,無需強行改名。Employee(員工)可有 promote()、transfer() 等業務行為。「面向對象技術很多,但面向對象的程序員不多。」—— Adele Goldberg
這條簡單規則不是教條,而是通往真正 OO 設計的思維鑰匙。下次想寫 UserManager 時,停下來想想:它真的是 UserRegistry、UserProfile、AuthenticationService,還是單純的 User 加上行為?