C 程序員轉 Java 時,最大障礙不是語法,而是思維範式。習慣「先想數據結構、再寫函數、最後組裝 main」的自底向上過程式思維,導致寫出的 Java 代碼只是「帶類語法的 C」。本文通過兩個對比案例,演示如何建立自頂向下、領域驅動的 OO 思維。
Java 硬套版:三個類 —— DbSender(讀庫+發送)、MailBuilder(MIME編碼)、Main(參數解析)。本質仍是模塊化過程式,類只是函數容器,邏輯耦合在「如何實現」細節上。
問:業務需要什麼對象?它們有什麼行為?
render(Map<String,Object> data) → StringList<Recipient> loadAll()send(Mail mail, Recipient to) (封裝 SMTP/Sendmail/雲 API)batchSend(Template, List<Recipient>) (事務、重試、限流)核心差異:類名來自業務名詞,方法名來自業務動詞,實現細節 (JDBC、MIME、命令行) 被封裝在私有方法或輔助類中,對外呈現純粹的領域語言。
「我需要一個計數器,刷新頁面加 1,能歸零,能設置任意值 (作弊用)。」
public class Counter {
// 核心業務行為
public int getCount(String id); // 獲取計數
public void increment(String id); // 刷新頁面加 1 (隱含在 get 或單獨方法)
public void reset(String id); // 歸零
public void setCount(String id, int v); // 設置任意值
}
// count.cgi / Servlet
String id = request.getParameter("id");
Counter counter = new Counter(); // 或注入
int current = counter.getCount(id); // 內部自動 increment
response.getWriter().print(current);
過程式建模洩露實現細節 (HTTP、SQL、更新邏輯) 到核心邏輯層,導致難以測試、難以替換存儲 (Redis/文件/分布式)、難以擴展 (緩存、限流)。
| 維度 | 過程式思維 | 面向對象思維 |
|---|---|---|
| 起點 | 「如何實現」(數據結構、算法、API) | 「業務需要什麼」(名詞→類,動詞→方法) |
| 封裝邊界 | 模塊/文件/函數庫 | 對象 (數據+行為不可分割) |
| 依賴方向 | 高層依賴低層 (Main 調用 DbSender) | 高層定義抽象,低層實現 (Service 依賴 Repository 接口) |
OO 不是語法糖,是認知升級。當你開始用業務語言思考、用領域模型建模、用接口契約解耦,你就真正進入了面向對象的世界。