面向過程思維 = 站在機器角度思考「怎麼做」
面向物件思維 = 站在業務角度思考「是什麼、有什麼行為」
缺點:職責混雜、難復用、業務邏輯散落在技術細節中。
// 領域物件:郵件
public class JunkMail {
private String subject;
private String body;
private String recipient;
public JunkMail(String subject, String body) { ... }
public boolean sendTo(String address) { ... } // 發送單封
public void sendToAll(Collection addresses) { ... } // 批次發送
}
// 另一個領域物件:郵件地址庫
public interface MailRepository {
Collection findAllSubscribers(); // 領域語言,非 selectSQL()
}
// 使用者代碼極簡
JunkMail mail = new JunkMail("大促銷", "內容...");
mail.sendToAll(repository.findAllSubscribers());
// 客戶需求語言
public interface Counter {
int increment(String id); // 訪問 +1 並回傳新值
void reset(String id); // 歸零
void set(String id, int value); // 設定 (作弊用)
}
// 實現細節隱藏在實作類
public class JdbcCounter implements Counter { ... }
public class RedisCounter implements Counter { ... }
// CGI 處理器
String id = request.getParameter("id");
int count = counter.increment(id);
response.getWriter().print(count);
// ❌ 洩露實現細節
public Vector listUsers() { ... }
// ✅ 面向介面
public Iterator listUsers() { ... } // 或 Iterable, Stream
| 錯誤提問 | 正確提問 |
|---|---|
| 「怎麼封裝 JDBC select?」 | 「用戶列表的領域行為是什麼?」 |
| 「要用 Vector 還是 ArrayList?」 | 「呼叫端需要什麼樣的遍歷契約?」 |
| 「Service 層要不要注入 DAO?」 | 「領域服務需要什麼倉儲契約?」 |
「不走彎路,就是捷徑。」拋開 `if/else`、`SQL`、`JSON`、`Thread` 等技術噪音,先用純中文/英文寫出領域介面契約。當介面穩定、語意清晰,技術實現自然水到渠成。這就是面向物件思維的精髓:代碼說業務語言。