"Domain-Model"
- 資料袋與領域模型
判斷一個型別該是一袋欄位還是有行為的領域模型:判準是「有沒有不允許任意組合的欄位」。含判準用錯時規則退化成建議的機制、以及資料袋起步後升級的演化訊號。
- entity 與 value object 的判準
同一個業務概念該建成 entity 還是 value object:判準是「操作需不需要 identity-based 回寫」、而不是概念重要性或有沒有 id 可填。含判準隨生命週期重問的交棒時機、value object 的語意封閉、枚舉分層。
- 不變式的強制層次
業務約束落在文件層、型別層、執行層的差異與代價:違反時是靜默、編譯失敗還是當場拒絕。含不變式被撞時「需求違規 vs 約束錯形」的分辨、存在條件與輸入品質的分層邊界。
- 狀態轉換與稽核軌跡
領域方法作為唯一變更路徑:判準是「變更有沒有需要一起完成的伴隨動作」。含唯一路徑與建議路徑的分界、稽核軌跡出洞的靜默機制與凍結作為稽核端點。
- copyWith 是逃生口,不是設計 — 從一個測試 bug 追到 entity 稽核軌跡的洞
copyWith 對純資料載體是正確工具,對有領域方法的 entity 是繞過不變式的逃生口。從一個 3 字元 ID 觸發的例外,追出同族語意錯誤、被繞過的領域方法、以及從未被強制的註解約束。
- 同一個品項、四個 model — value object 什麼時候該升級成 entity
同一個業務概念要不要拆成多個 model、value object 什麼時候該升級成 entity——判準是操作需不需要 identity-based 回寫。以 POS 品項從點選、掛單、結算到歷史訂單的四階段模型為例,含 snapshot 與 live reference 的凍結時機。
- 桌子跟購物車是兩個聚合 — 從「提前結帳」推導生命週期解耦
兩個業務資源該綁死成一對一、還是解耦成獨立生命週期加綁定關係——判準是有沒有業務操作需要其中一方獨立存活。以 POS 的提前結帳、純佔桌、外賣單推導桌位與購物車的聚合邊界,含組合空間大於業務空間時的非法組合封鎖。