我從學習 Java 開始接觸 OOP。初期習慣 C 的簡潔高效,覺得 Java 代碼冗長、運行慢、一件小事要寫許多類、類之間層層調用,內心強烈抗拒。
自以為領悟 OOP 後開始有意識運用,但面對具體問題仍不知如何提煉類,腦中千頭萬緒,不知下手,不慎又回到舊思路。
郵件列表在資料庫。用 C 思維:讀郵件內容 → 連資料庫 → 迴圈取地址 → 調用 sendmail 發送。
改用 Java,覺得不能全塞進 main,設計三個類:
這是從「程式設計師實現功能」角度、自低向上(機器視角→現實視角)分析,已將實現細節混入設計,試圖從底層實現滿足業務需求。這在 Java 反而比 C 更繁瑣、邏輯更不清晰。
只要領會此點,即掌握 OOP 思維方法。
需求:客戶訪問頁面,計數器 +1。URL 形式:https://hostname/count.cgi?id=xxx。後台資料庫表記錄每個 id 的計數值。
程式設計師角度:取 id → 查資料庫 → 取計數值 → +1 → 更新資料庫 → 輸出計數。
無程式經驗者角度:我需要一個計數器,功能:刷新頁面計數 +1、歸零、可設定任意值(作弊用)。完全不考慮資料庫操作、HTTP 參數傳遞,只關注業務邏輯與功能。
依此思路設計 Counter 類:
public class Counter {
public int getCount(int id) {}
public void resetCounter(int id) {}
public void setCount(int id, int currentCount) {}
}
使用端:
// 從 HTTP 環境取 id Counter myCounter = new Counter(); int currentCount = myCounter.getCount(id); // 輸出給瀏覽器
解決問題框架已成,Counter 內部實現細節(資料庫操作等)被封裝,使用者只需關注「做什麼」,不關心「怎麼做」。這就是面向物件的核心:關注責任分配與介面契約,而非實現細節。