<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>聚合根 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/%E8%81%9A%E5%90%88%E6%A0%B9/</link><description>Recent content in 聚合根 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 10 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E8%81%9A%E5%90%88%E6%A0%B9/index.xml" rel="self" type="application/rss+xml"/><item><title>Aggregate Root</title><link>https://tarrragon.github.io/blog/ddd/knowledge-cards/aggregate-root/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/ddd/knowledge-cards/aggregate-root/</guid><description>&lt;p>聚合根是對外代表一組資料一致性的邊界物件。外部操作只跟聚合根互動、不直接碰內部的 &lt;a href="https://tarrragon.github.io/blog/ddd/knowledge-cards/entity/" data-link-title="Entity" data-link-desc="判斷一個概念該建成 entity 還是 value object 時使用。entity 的同一性由身份定義——欄位全部改變、只要身份參照不變就是同一個。">entity&lt;/a> 或 &lt;a href="https://tarrragon.github.io/blog/ddd/knowledge-cards/value-object/" data-link-title="Value Object" data-link-desc="判斷一個概念該用內容比對還是身份追蹤時使用。value object 的同一性由內容定義——內容相等就是同一個、替換實例對系統沒有影響。">value object&lt;/a>；聚合根負責保證邊界內所有&lt;a href="https://tarrragon.github.io/blog/ddd/knowledge-cards/invariant/" data-link-title="Invariant" data-link-desc="領域模型的約束規則落在哪一層時使用。不變式是在物件整個生命週期都必須為真的業務規則——狀態只能沿流程轉換、被同一條規則綁住的欄位必須一起換。">不變式&lt;/a>在每次操作結束時成立。一致性的範圍就是聚合的邊界——邊界內是同一個事務、邊界外是最終一致。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>聚合根是本模組尚未展開的章節主題（模組 backlog）。目前在教學章中以例子形態出現：一個 POS 專案的商品從扁平結構長成雙層聚合——商品作為聚合根、規格作為子層——欄位歸屬的判準是「兩個規格會不會不同」（&lt;a href="https://tarrragon.github.io/blog/ddd/data-bag-vs-domain-model/" data-link-title="資料袋與領域模型" data-link-desc="判斷一個型別該是一袋欄位還是有行為的領域模型：判準是「有沒有不允許任意組合的欄位」。含判準用錯時規則退化成建議的機制、以及資料袋起步後升級的演化訊號。">資料袋與領域模型&lt;/a>）。聚合的邊界跟 &lt;a href="https://tarrragon.github.io/blog/ddd/knowledge-cards/entity/" data-link-title="Entity" data-link-desc="判斷一個概念該建成 entity 還是 value object 時使用。entity 的同一性由身份定義——欄位全部改變、只要身份參照不變就是同一個。">entity&lt;/a> 的生命週期邊界是兩個獨立的設計決策。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>多個物件的修改必須一起成功或一起失敗、而這些物件目前散在不同的存取路徑——缺少聚合根把它們收在同一個一致性邊界裡。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>聚合根的邊界劃太大會把不相關的物件鎖在同一個事務、限制併發；劃太小會讓跨聚合的一致性問題推到應用層。邊界的判準是「哪些不變式必須在同一次操作內成立」。完整教學等 case 累積後展開。&lt;/p></description><content:encoded><![CDATA[<p>聚合根是對外代表一組資料一致性的邊界物件。外部操作只跟聚合根互動、不直接碰內部的 <a href="/blog/ddd/knowledge-cards/entity/" data-link-title="Entity" data-link-desc="判斷一個概念該建成 entity 還是 value object 時使用。entity 的同一性由身份定義——欄位全部改變、只要身份參照不變就是同一個。">entity</a> 或 <a href="/blog/ddd/knowledge-cards/value-object/" data-link-title="Value Object" data-link-desc="判斷一個概念該用內容比對還是身份追蹤時使用。value object 的同一性由內容定義——內容相等就是同一個、替換實例對系統沒有影響。">value object</a>；聚合根負責保證邊界內所有<a href="/blog/ddd/knowledge-cards/invariant/" data-link-title="Invariant" data-link-desc="領域模型的約束規則落在哪一層時使用。不變式是在物件整個生命週期都必須為真的業務規則——狀態只能沿流程轉換、被同一條規則綁住的欄位必須一起換。">不變式</a>在每次操作結束時成立。一致性的範圍就是聚合的邊界——邊界內是同一個事務、邊界外是最終一致。</p>
<h2 id="概念位置">概念位置</h2>
<p>聚合根是本模組尚未展開的章節主題（模組 backlog）。目前在教學章中以例子形態出現：一個 POS 專案的商品從扁平結構長成雙層聚合——商品作為聚合根、規格作為子層——欄位歸屬的判準是「兩個規格會不會不同」（<a href="/blog/ddd/data-bag-vs-domain-model/" data-link-title="資料袋與領域模型" data-link-desc="判斷一個型別該是一袋欄位還是有行為的領域模型：判準是「有沒有不允許任意組合的欄位」。含判準用錯時規則退化成建議的機制、以及資料袋起步後升級的演化訊號。">資料袋與領域模型</a>）。聚合的邊界跟 <a href="/blog/ddd/knowledge-cards/entity/" data-link-title="Entity" data-link-desc="判斷一個概念該建成 entity 還是 value object 時使用。entity 的同一性由身份定義——欄位全部改變、只要身份參照不變就是同一個。">entity</a> 的生命週期邊界是兩個獨立的設計決策。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>多個物件的修改必須一起成功或一起失敗、而這些物件目前散在不同的存取路徑——缺少聚合根把它們收在同一個一致性邊界裡。</p>
<h2 id="設計責任">設計責任</h2>
<p>聚合根的邊界劃太大會把不相關的物件鎖在同一個事務、限制併發；劃太小會讓跨聚合的一致性問題推到應用層。邊界的判準是「哪些不變式必須在同一次操作內成立」。完整教學等 case 累積後展開。</p>
]]></content:encoded></item></channel></rss>