<?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/%E5%BF%AB%E7%85%A7/</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/%E5%BF%AB%E7%85%A7/index.xml" rel="self" type="application/rss+xml"/><item><title>Snapshot</title><link>https://tarrragon.github.io/blog/ddd/knowledge-cards/snapshot/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/ddd/knowledge-cards/snapshot/</guid><description>&lt;p>Snapshot 是某一時刻的狀態複本、凍結之後不隨來源資料的後續變更而改動。歷史訂單記錄下單當時的商品名稱與價格——商品後續改名、下架、調價，訂單仍顯示當時購買的內容。跟 live 參照相反：live 參照指向來源的當前狀態、來源改了就跟著變。兩者的選擇由「這筆資料有沒有成為事實」決定。凍結的是狀態；已發生的事實本身由 &lt;a href="https://tarrragon.github.io/blog/ddd/knowledge-cards/domain-event/" data-link-title="Domain Event" data-link-desc="系統裡出現「為了讓某頁刷新而補發事件」或「監聽端掛全事件過濾器」時使用。domain event 是已發生的業務事實——過去式命名、發布後不可變、錯過代表事實遺失。">domain event&lt;/a> 承載——snapshot 記「當時的世界長什麼樣」、event 記「當時發生了什麼」。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Snapshot 跟 &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> 的生命週期有關——概念成為歷史事實之後、live 內容參照要凍結。凍結的同時身份參照通常繼續承重（退貨鍵、取消鍵）。Snapshot 也是稽核的端點——記錄事件發生當下的世界、而不是現在的世界（見 &lt;a href="https://tarrragon.github.io/blog/ddd/state-transition-and-audit-trail/" data-link-title="狀態轉換與稽核軌跡" data-link-desc="領域方法作為唯一變更路徑：判準是「變更有沒有需要一起完成的伴隨動作」。含唯一路徑與建議路徑的分界、稽核軌跡出洞的靜默機制與凍結作為稽核端點。">狀態轉換與稽核軌跡&lt;/a>）。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>歷史記錄的顯示內容跟著現行資料變動（商品改名、訂單明細跟著變）——參照凍結時機漏掉了。進行中的資料不跟著最新狀態走（購物車品項的價格不跟會員身分變動）——凍結太早。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>凍結時機由業務對「過去」的要求決定——進行中的操作持 live 參照是正確的、成為事實之後凍結。業務流程有多個確認階段時、凍結時機取決於哪個階段之後的漂移對下游不可接受。凍結判準的完整展開見 &lt;a href="https://tarrragon.github.io/blog/ddd/entity-vs-value-object/" data-link-title="entity 與 value object 的判準" data-link-desc="同一個業務概念該建成 entity 還是 value object：判準是「操作需不需要 identity-based 回寫」、而不是概念重要性或有沒有 id 可填。含判準隨生命週期重問的交棒時機、value object 的語意封閉、枚舉分層。">entity 與 value object 的判準&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Snapshot 是某一時刻的狀態複本、凍結之後不隨來源資料的後續變更而改動。歷史訂單記錄下單當時的商品名稱與價格——商品後續改名、下架、調價，訂單仍顯示當時購買的內容。跟 live 參照相反：live 參照指向來源的當前狀態、來源改了就跟著變。兩者的選擇由「這筆資料有沒有成為事實」決定。凍結的是狀態；已發生的事實本身由 <a href="/blog/ddd/knowledge-cards/domain-event/" data-link-title="Domain Event" data-link-desc="系統裡出現「為了讓某頁刷新而補發事件」或「監聽端掛全事件過濾器」時使用。domain event 是已發生的業務事實——過去式命名、發布後不可變、錯過代表事實遺失。">domain event</a> 承載——snapshot 記「當時的世界長什麼樣」、event 記「當時發生了什麼」。</p>
<h2 id="概念位置">概念位置</h2>
<p>Snapshot 跟 <a href="/blog/ddd/knowledge-cards/entity/" data-link-title="Entity" data-link-desc="判斷一個概念該建成 entity 還是 value object 時使用。entity 的同一性由身份定義——欄位全部改變、只要身份參照不變就是同一個。">entity</a> 的生命週期有關——概念成為歷史事實之後、live 內容參照要凍結。凍結的同時身份參照通常繼續承重（退貨鍵、取消鍵）。Snapshot 也是稽核的端點——記錄事件發生當下的世界、而不是現在的世界（見 <a href="/blog/ddd/state-transition-and-audit-trail/" data-link-title="狀態轉換與稽核軌跡" data-link-desc="領域方法作為唯一變更路徑：判準是「變更有沒有需要一起完成的伴隨動作」。含唯一路徑與建議路徑的分界、稽核軌跡出洞的靜默機制與凍結作為稽核端點。">狀態轉換與稽核軌跡</a>）。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>歷史記錄的顯示內容跟著現行資料變動（商品改名、訂單明細跟著變）——參照凍結時機漏掉了。進行中的資料不跟著最新狀態走（購物車品項的價格不跟會員身分變動）——凍結太早。</p>
<h2 id="設計責任">設計責任</h2>
<p>凍結時機由業務對「過去」的要求決定——進行中的操作持 live 參照是正確的、成為事實之後凍結。業務流程有多個確認階段時、凍結時機取決於哪個階段之後的漂移對下游不可接受。凍結判準的完整展開見 <a href="/blog/ddd/entity-vs-value-object/" data-link-title="entity 與 value object 的判準" data-link-desc="同一個業務概念該建成 entity 還是 value object：判準是「操作需不需要 identity-based 回寫」、而不是概念重要性或有沒有 id 可填。含判準隨生命週期重問的交棒時機、value object 的語意封閉、枚舉分層。">entity 與 value object 的判準</a>。</p>
]]></content:encoded></item></channel></rss>