六邊形架構——DDD 的最佳搭檔

看到上篇 DDD 的四層架構文章反響不錯,今天再來談談另外一種架構 ---「六邊形架構」

提到領域驅動設計(DDD),大家第一反應是啥?“聽起來很高大上,但我沒用過” 對吧?別急,今天我們不聊那些聽着頭大、看着困的定義,咱們直接來點乾貨,講講 DDD 中最常見、也最實用的架構——六邊形架構(Hexagonal Architecture)。

別看它名字挺科幻,其實很接地氣。想象一下,你在玩一款特別經典的遊戲《俄羅斯方塊》。這遊戲看着簡單吧?但其實它的核心玩法(即不斷拼接落下來的方塊)是永遠不變的,而那些花裏胡哨的控制方式(比如按鍵、手勢、甚至腦電波)可以不斷更換。這其實就是六邊形架構的精髓——「把核心邏輯和外部依賴分離」

什麼是六邊形架構?

六邊形架構,又叫**「端口和適配器架構」**。顧名思義,它的設計理念就是像六邊形那樣,把系統核心(業務邏輯)包裹在中間,周圍的每個 “邊” 都是一個端口,用來和外界通訊。外部系統要想跟核心打交道,必須通過這些端口來適配。

簡單點說,「業務核心是國王,所有外部系統(像數據庫、UI、API 等)都是國王的臣民,臣民得通過王宮的門才能拜見國王」,而國王絕對不會自己走出王宮去見臣民。因爲這可是國王嘛,要有派頭!

六邊形架構的特點

既然有國王和臣民,這就有了職責分明的架構特點:

  1. 「業務核心獨立」:核心的業務邏輯被放在 “王宮” 裏,它不依賴任何具體的技術,比如數據庫、UI、消息隊列等。換句話說,核心邏輯只關心“我該做什麼”,而不關心“我怎麼做”。

  2. 「可替換的外部接口」:外部系統(比如數據庫、UI)都是通過端口和適配器與業務核心連接的。如果你哪天心血來潮想換掉數據庫,或者把 UI 從 Vue 換成 React,只需要換掉適配器,不影響核心邏輯。

  3. 「測試友好」:六邊形架構中,核心業務邏輯和外部系統分離得很乾淨,這讓單元測試變得特別方便。測試時,只需要模擬端口,根本不需要依賴數據庫、網絡請求等外部因素。

爲什麼叫 “六邊形”?

你可能好奇,爲什麼非要叫六邊形,而不是四邊形或者八邊形呢?其實,“六邊形” 純粹是爲了畫圖方便,顯得酷炫罷了。實際中,這些端口的數量是可變的,你可以有四邊、五邊甚至更多邊,但不管幾邊,原則不變——「核心邏輯在中間,外部依賴在邊緣,通過端口適配溝通」

實戰一下六邊形架構

話不多說,咱們直接上代碼!假設我們要做一個電商系統中的 “下訂單” 功能。

  1. 「核心邏輯(領域層)」
public class OrderService {
    public void placeOrder(Order order) {
        // 核心業務邏輯,比如驗證庫存、計算運費等
        System.out.println("Processing order: " + order.getId());
    }
}
  1. 「端口(接口層)」
public interface OrderRepository {
    void save(Order order);
}
  1. 「適配器(基礎設施層)」: 假設我們用 MySQL 存儲訂單,寫個適配器:
public class MySqlOrderRepository implements OrderRepository {
    @Override
    public void save(Order order) {
        // 假裝這裏是數據庫操作
        System.out.println("Saving order to MySQL: " + order.getId());
    }
}
  1. 「接口適配」: 假設我們有一個 Web API 用來接收訂單請求:
public class OrderController {
    private final OrderService orderService;
    private final OrderRepository orderRepository;

    public OrderController(OrderService orderService, OrderRepository orderRepository) {
        this.orderService = orderService;
        this.orderRepository = orderRepository;
    }

    public void placeOrder(Order order) {
        orderService.placeOrder(order);
        orderRepository.save(order);
    }
}

在這個例子中,OrderService 是核心邏輯,它不關心訂單存在哪個數據庫中,也不在乎訂單是通過 Web 請求還是別的方式進來的。所有的這些外部系統通過接口(端口)連接,然後由具體的 MySQL 實現(適配器)來完成。

六邊形架構帶來的好處

  1. 「靈活應對變化」:你可以隨時更換適配器,比如把數據庫從 MySQL 換成 MongoDB,甚至把 Web API 換成消息隊列,核心邏輯完全不受影響。

  2. 「可測試性強」:業務邏輯的獨立性讓你可以輕鬆編寫單元測試,不用擔心數據庫或網絡不在線的問題。

  3. 「架構清晰」:職責分明,核心邏輯和技術細節各司其職,不會互相干擾。

總結

六邊形架構就是 DDD 的最佳拍檔,它讓你能夠更好地管理複雜的業務邏輯,同時保持系統的靈活性和可擴展性。雖然名字看起來複雜,但背後的理念非常簡單:「核心邏輯至高無上,所有外部系統都得通過指定端口拜見」

所以,別再覺得 DDD 是個只存在於象牙塔裏的概念了,用上六邊形架構,你也能輕鬆駕馭它,讓你的代碼既高效又優雅!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/0DTTbvSQZX2m-tMQ9U3Rhw