首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

一針見血:面向物件思維的核心 — 從業務邏輯出發,而非程式實現

     編輯:Java 相關知識

核心觀點

面向過程思維 = 站在機器角度思考「怎麼做」
面向物件思維 = 站在業務角度思考「是什麼、有什麼行為」

對比案例:發送廣告郵件

❌ 面向過程 (C 風格) — 按技術步驟分模組

  • 模組 A:讀郵件內容、MIME 編碼
  • 模組 B:連資料庫、查地址、呼叫 `sendmail`
  • 主程式:串聯參數、協調流程

缺點:職責混雜、難復用、業務邏輯散落在技術細節中。

✅ 面向物件 — 識別領域概念與職責


// 領域物件:郵件
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());

再例:網頁計數器

過程思維

  1. 取 HTTP 參數 `id`
  2. SQL 查計數
  3. +1 更新
  4. 輸出 HTML

物件思維


// 客戶需求語言
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
  • 呼叫端只依賴 `hasNext()/next()` 契約
  • 實現可自由切換 `ArrayList`、`LinkedList`、資料庫游標、網路流
  • 降低耦合、提高可測試性、支援多態替換

思維轉換三步驟

  1. 聽領域語言:與業務專家對話,提取名詞 (實體/值物件) 與動詞 (行為/服務)
  2. 畫職責邊界:每個類只負責一件業務事 (SRP),行為內聚、資料封裝
  3. 定介面、後實作:先寫介面簽名 (契約),再考慮資料庫、框架、演算法

常見回滯陷阱

錯誤提問正確提問
「怎麼封裝 JDBC select?」「用戶列表的領域行為是什麼?」
「要用 Vector 還是 ArrayList?」「呼叫端需要什麼樣的遍歷契約?」
「Service 層要不要注入 DAO?」「領域服務需要什麼倉儲契約?」

進階:領域驅動設計 (DDD) 視角

  • 實體:有身分識別、生命週期 (User、Order)
  • 值物件:無身分、不可變、結構相等 (Money、Address、Email)
  • 聚合根:一致性邊界、統一存取入口 (Order → OrderItem)
  • 領域服務:無狀態、跨聚合業務邏輯 (轉帳、定價)
  • 倉儲:集合導向介面、隱藏持久化細節

結語

「不走彎路,就是捷徑。」拋開 `if/else`、`SQL`、`JSON`、`Thread` 等技術噪音,先用純中文/英文寫出領域介面契約。當介面穩定、語意清晰,技術實現自然水到渠成。這就是面向物件思維的精髓:代碼說業務語言。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved