許多從 C/C++ 轉型 Java 的開發者,初期會將面向對象誤解為「把函數塞進類裡」,導致設計出披著 OOP 外衣的過程式代碼。本文透過三個對比案例,深度剖析面向對象思維的本質差異,引導你完成從「機器執行視角」到「業務領域建模視角」的認知轉型。
過程式思維:先想「如何實現」—— 讀配置、連資料庫、迴圈發送、調用 sendmail。
物件思維:先想「業務是什麼」—— 郵件有主旨、內容、收件人;郵件會發送、列出收件人清單。
本質是將實現步驟包裝成類,耦合度高、擴展性差。
public class JunkMail {
private String head, body, address;
public JunkMail() {
// 從配置檔載入 head、body
}
public static boolean sendMail(String address) {
// 調用 qmail 發送
}
public static Collection listAllMail() {
// 訪問資料庫返回地址集合
}
}
調用端極簡潔:new JunkMail().sendMail(addr)。業務邏輯封裝在物件內,實現細節對調用端透明。
非技術人員會說:「我要一個計數器,能加 1、歸零、設定任意值。」
public class Counter {
public int getCount(int id) { /* 查庫、加1、回傳 */ }
public void resetCounter(int id) { /* 更新庫為 0 */ }
public void setCount(int id, int value) { /* 更新庫為指定值 */ }
}
使用端:new Counter().getCount(id)。實現細節(資料庫、HTTP)完全隱藏在方法內部。
public Vector listUsers() {
// 查庫塞入 Vector 返回
}
呼叫端綁定 Vector,換 ArrayList 需改動呼叫端。
public interface Iterator {
boolean hasNext();
Object next();
}
public class User {
public Iterator listUsers() { /* 返回實作 Iterator 的任意類 */ }
}
呼叫端只依賴 Iterator 介面:
Iterator it = user.listUsers();
while (it.hasNext()) { Object u = it.next(); ... }
實現可換 ArrayList、LinkedList、自定義游標、資料庫流式游標……呼叫端零修改。
設計時若腦海浮現「用 HashMap 存」、「寫 SQL 查」,立即暫停 —— 這是實現細節。請轉而問:「這個業務概念叫什麼?它需要提供什麼行為?」先寫介面與方法簽名,最後再填充方法體。
掌握此思維,代碼將自然呈現高內聚、低耦合、易擴展的優雅結構,開發過程也從枯燥的邏輯拼湊轉變為充滿設計美感的建模創作。