🏛 企業應用架構模式

PoEAA

領域邏輯三選項 Transaction Script(程序式)/Domain Model(物件化)/Table Module

資料源二選一 Active Record(簡單)vs Data Mapper(乾淨但複雜)

分層 展現層/領域層/資料源層,各司其職

🎯 什麼情境該想到我

當你的業務邏輯「散落各處、service 層越來越肥、不知道邏輯該放哪」時。

⚙️ 怎麼用(依業務複雜度選)

  1. Transaction Script(交易腳本):一個動作=一段程序式流程。簡單業務用它最直接,別過度設計。
  2. Domain Model(領域模型):把業務邏輯放進有行為的領域物件(充血模型),而非只有 getter/setter 的貧血物件 + 肥 service。複雜、多變的業務用它才管得住(呼應 領域驅動設計)。
  3. Table Module:以「一張表對應一個類別」組織邏輯,介於兩者之間。

判斷:業務越複雜、規則越多變 → 越該用 Domain Model;越簡單 → 越該用 Transaction Script。 別為簡單 CRUD 硬套領域模型。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • 「貧血模型 + 肥 service」在複雜業務下會失控;但簡單 CRUD 硬做充血模型也是過度工程。按複雜度選。

🔗 相關工具

🎯 什麼情境該想到我

當你要設計「物件如何對應到資料庫」,或在不同 ORM 風格間抉擇、遇到 ORM 效能問題時。

⚙️ 怎麼用(認識底層模式)

  1. Active Record:物件自己包含資料庫存取邏輯(user.save())。簡單、快速,適合邏輯不複雜的 CRUD(Rails、Eloquent)。
  2. Data Mapper:物件與資料庫完全分離,由 Mapper 負責搬運。乾淨、可測、領域物件不依賴 DB,適合複雜領域(Hibernate、Prisma、TypeORM 的 mapper 風格)。
  3. Unit of Work:一次交易內追蹤所有變更,最後統一提交/回滾 → 減少 DB 往返、保證一致。
  4. Identity Map:同一物件一次請求只載入一次,避免重複查詢與不一致。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • ORM 隱藏了 SQL,容易踩 N+1 查詢與意外的大量載入;效能敏感處要看實際 SQL(呼應 工具-交易與隔離等級)。

🔗 相關工具

① 領域邏輯 Domain Logic

  • [[交易指令稿|交易指令稿 Transaction Script]]
  • [[領域模型|領域模型 Domain Model]]
  • [[表格模組|表格模組 Table Module]]
  • [[服務層|服務層 Service Layer]]

② 資料源架構 Data Source Architectural

  • [[表格資料閘道|表格資料閘道 Table Data Gateway]]
  • [[列資料閘道|列資料閘道 Row Data Gateway]]
  • [[主動記錄|主動記錄 Active Record]]
  • [[資料對應器|資料對應器 Data Mapper]]

③ 物件關聯行為 O-R Behavioral

  • [[工作單元|工作單元 Unit of Work]]
  • [[識別對應|識別對應 Identity Map]]
  • [[延遲載入|延遲載入 Lazy Load]]

④ 物件關聯結構 O-R Structural

  • [[識別欄位|識別欄位 Identity Field]]
  • [[外鍵對應|外鍵對應 Foreign Key Mapping]]
  • [[關聯表對應|關聯表對應 Association Table Mapping]]
  • [[從屬對應|從屬對應 Dependent Mapping]]
  • [[內嵌值|內嵌值 Embedded Value]]
  • [[序列化大物件|序列化大物件 Serialized LOB]]
  • [[單表繼承|單表繼承 Single Table Inheritance]]
  • [[類別表繼承|類別表繼承 Class Table Inheritance]]
  • [[具象表繼承|具象表繼承 Concrete Table Inheritance]]
  • [[繼承對應器|繼承對應器 Inheritance Mappers]]

⑤ 物件關聯中繼資料 O-R Metadata

  • [[中繼資料對應|中繼資料對應 Metadata Mapping]]
  • [[查詢物件|查詢物件 Query Object]]
  • [[儲存庫|儲存庫 Repository]]

⑥ Web 表現層 Web Presentation

  • [[模型-視圖-控制器|模型-視圖-控制器 Model View Controller]]
  • [[頁面控制器|頁面控制器 Page Controller]]
  • [[前端控制器|前端控制器 Front Controller]]
  • [[樣板視圖|樣板視圖 Template View]]
  • [[轉換視圖|轉換視圖 Transform View]]
  • [[兩步驟視圖|兩步驟視圖 Two Step View]]
  • [[應用控制器|應用控制器 Application Controller]]

⑦ 分散式 Distribution

  • [[遠端外觀|遠端外觀 Remote Facade]]
  • [[資料傳輸物件|資料傳輸物件 Data Transfer Object]]

⑧ 離線並發 Offline Concurrency

  • [[樂觀離線鎖|樂觀離線鎖 Optimistic Offline Lock]]
  • [[悲觀離線鎖|悲觀離線鎖 Pessimistic Offline Lock]]
  • [[粗粒度鎖|粗粒度鎖 Coarse-Grained Lock]]
  • [[隱含鎖|隱含鎖 Implicit Lock]]

⑨ 會話狀態 Session State

  • [[用戶端會話狀態|用戶端會話狀態 Client Session State]]
  • [[伺服器會話狀態|伺服器會話狀態 Server Session State]]
  • [[資料庫會話狀態|資料庫會話狀態 Database Session State]]

⑩ 基礎模式 Base Patterns

  • [[閘道|閘道 Gateway]]
  • [[對應器|對應器 Mapper]]
  • [[層超型|層超型 Layer Supertype]]
  • [[分離介面|分離介面 Separated Interface]]
  • [[登錄器|登錄器 Registry]]
  • [[值物件|值物件 Value Object]]
  • [[金錢|金錢 Money]]
  • [[特例|特例 Special Case]]
  • [[外掛|外掛 Plugin]]
  • [[服務樁|服務樁 Service Stub]]
  • [[記錄集|記錄集 Record Set]]

✨ 關鍵取捨

🧰 即用工具

① 領域邏輯(4)

② 資料源架構(4)

③ 物件關聯行為(3)

④ 物件關聯結構(10)

⑤ 物件關聯中繼資料(3)

⑥ Web 表現層(7)

⑦ 分散式(2)

⑧ 離線並發(4)

⑨ 會話狀態(3)

⑩ 基礎模式(11)