DDD 與 API-First 打造高品質靈活架構指南 實踐領域驅動設計 Domain Model 與 OCP 原則

me
林彥成
2023-10-02 | 3 min.
文章目錄
  1. 1. 什麼是 DDD 與 API-First?
  2. 2. Domain-Driven Design (DDD) 實踐步驟
    1. 2.1. Domain Model:定義核心實體與關係
    2. 2.2. 開放封閉原則 (OCP):建模時的擴展考量
    3. 2.3. API-First 開發方法:從介面設計開始
  3. 3. FAQ:DDD 與 API-First 常見問題
    1. 3.1. Q1:DDD 聽起來很複雜,小專案也需要用到嗎?
    2. 3.2. Q2:API-First 是否意謂著要先寫完所有的 API 規格才能動工?
    3. 3.3. Q3:如何判斷我的領域模型設計得好不好?

什麼是 DDD 與 API-First?

DDD (Domain-Driven Design, 領域驅動設計) 是一種以業務邏輯為核心的軟體開發方法論,強調透過開發者與領域專家(Domain Expert)的深度協作,建立一套「通用語言」與「領域模型 (Domain Model)」來應對複雜的業務需求。而 API-First 則是一種開發策略,主張在撰寫具體程式碼前,優先設計並定義應用程式介面(API)。這兩者結合能確保系統架構從初期就具備清晰的邊界與高度的靈活性,不僅能有效減少溝通誤差,更能落實 OCP (開放封閉原則),使系統易於擴展且難以因修改而崩壞。


當我們要準備買東西的時候,要考慮家裡有沒有空間,反之在室內設計時預留空間也很重要。在前端開發中,從需求分析到元件確認,系統設計的每一步都需要良好的架構指引。這篇 Domain-Driven Design (DDD) 教學 將帶您了解如何構建靈活的系統。

做生意的本質是商業,在各個領域中除了技術本身外最重要的就是商業邏輯。Domain-Driven Design (DDD) 提供了一種軟體設計和開發方法,強調以業務邏輯和領域 (Domain) 為核心基礎來進行軟體開發。

謎之音:大多數情況實際上是 Deadline Driven Development

Domain-Driven Design (DDD) 實踐步驟

Domain-Driven Design 通常分為三個核心步驟:

  1. 列出需要解決的商業問題。
  2. 進行建模 (Modeling)。
  3. 把商業模型變成可以 POC 程式碼。

跨部門溝通的目標是建立 Shared Mental Model

利用 領域模型 (Domain Model)、領域詞彙 (Domain Terms)、通用語言 (Ubiquitous Language) 來設計和描述系統,進而可以更快的去了解和在各部門同步使用者的流程、商業模式、系統的運行。

Domain Model:定義核心實體與關係

定義 領域模型 是 DDD 的重頭戲。在商業的世界中,除了實作的工程師外,最重要的就是該領域的專家 (Domain Expert)。

Domain Model 是一種設計方法,主要著重於定義和建立應用程式的領域模型,這個模型反映了應用程式核心概念和實體之間的關係。

建立 領域模型 的目的是讓系統能在早期就看到全貌,並持續進行細節的設計,而不是房子蓋到哪裡才想到哪裡。

就像常見的微服務中 API 互相呼叫可能產生複雜的網路結構,並且讓問題處理變得困難,Domain Model 有助於解決複雜的業務邏輯和需求,讓開發團隊更容易理解並實現應用程式的核心功能。

開放封閉原則 (OCP):建模時的擴展考量

建模這件事情來說有點像是定義房屋的結構,而建模可以盡可能的遵守 開放封閉原則 (Open-Closed Principle, OCP)

對於擴展是開放的,但對於修改是封閉的

某些規劃需要提前考慮,例如在蓋房子時預留冷氣位置和窗戶開口,因為房屋的結構不允許輕易地修改。

  • 擴展開放: 可以客製各式的家具
  • 修改封閉: 房屋結構更動

有時候老闆可能會覺得只要換個元件就好了,可是其實換元件就等於整個重寫,所以在系統設計時就要以這樣的理念去設計。

API-First 開發方法:從介面設計開始

API-First 單純是一個術語,關鍵還是在要解決的商業問題。

API-First 首先要對資源和 URL 進行建模,建模的內容則是依照剛剛專家所定義出的 領域模型。依照商業問題把該做好做對的事情列出來,選擇正確的資源並確保正確的細粒度非常重要,這樣客戶就能夠獲得所需的功能,並實現靈活性和易維護性。

API-First 是一種開發方法,API 本身提供了控制反轉的機制,強調在開發應用程式時優先設計和定義應用程式介面 (API),這包括進入點、資料格式、請求和回應等方面的設計,從 API 設計開始,就是從內容出發,然後著手實現前端和後端系統。

  • 促進團隊協作:不同的團隊和開發者之間協作可以同時根據 API 規格進行工作
  • 支持前後端分離:前後端分離時前端和後端團隊能夠獨立開發

FAQ:DDD 與 API-First 常見問題

Q1:DDD 聽起來很複雜,小專案也需要用到嗎?

A:不一定。DDD 的強項在於處理「複雜的業務邏輯」。如果您的專案只是一組簡單的 CRUD 操作,強行套用 DDD 軌跡(如 Aggregate Root, Entity, Value Object)反而會增加開發負擔。但學習「通用語言」與「領域拆解」的概念,對任何規模的專案溝通都有幫助。

Q2:API-First 是否意謂著要先寫完所有的 API 規格才能動工?

A:並非如此。API-First 重點在於「介面設計領先於實作」。您可以採用迭代的方式,先定義好本階段開發所需的 API 契約,讓前後端能根據這份契約同步開工,這比等後端寫完實作才讓前端串接要高效得多。

Q3:如何判斷我的領域模型設計得好不好?

A:一個好的領域模型應該是「業務專家也能看懂」的。如果您的模型圖充满了技術術語(如:Table, Join, ID),那可能只是資料庫設計;真正的領域模型應專注於商業行為與流程,且能對應到通用語言中的動詞與名詞。


掌握了 Domain-Driven DesignAPI-First 的核心,您就能從混亂的程式碼叢林中解放出來。記住,軟體設計的終極目標是為了解決真實世界的商業問題,而非僅僅是堆砌技術!


喜歡這篇文章,請幫忙拍拍手喔 🤣