principle-model-the-domain | 用資料結構承載領域規則
本頁以 pstack-claude 0.9.126 為基準。原文設定 user-invocable: false,通常由 poteto-mode 按需讀取。用自然語言要求「套用 principle-model-the-domain」,請代理先找能承載規則的資料結構,而不是先增加條件分支。
定位與適用情境
領域模型(Domain Model)應表達實際允許的狀態、資料與規則。原文提供狀態機、具型別模型、查找表、事件模型與合適集合等方向,也明說不要強迫抽象。若現有程式清楚、局部且不易擴張,直接的實作可能更好。
本例的檔案上傳器以 isUploading、isComplete、hasError 控制畫面,偶爾同時顯示完成與失敗。輸入是現有旗標的讀寫位置、進度回呼與重試需求。目標是讓互斥狀態不再依賴各處自行同步。
準備
- 提供所有旗標讀寫、上傳事件與取消事件的呼叫端,不能只看畫面元件。
- 列出實際規則。例如只有成功狀態有結果識別碼,失敗狀態才有錯誤資訊。
- 準備成功、失敗、取消與重試的事件序列,以及「完成後收到舊進度事件」的案例。
操作步驟
- 找出禁止狀態。 列出目前布林組合中哪些沒有業務意義,追查它們如何產生。也列出各個狀態真正需要的資料,不把所有欄位都設為可選。
- 比較最小模型。 本例可評估以判別聯集(Discriminated Union)表達待命、上傳中、成功與失敗,再用明確事件表達轉移。說明它消除了哪些非法組合,避免只換一套名稱。
- 集中規則擁有權。 將同一上傳生命週期的轉移與不變條件放在清楚的邊界,讓畫面讀取狀態。不要按載入、驗證、儲存等執行順序拆散同一條領域規則。
- 用事件序列檢查。 對成功、失敗、重試與過期回呼逐一列出預期結果。新增狀態後,確認消費者不能漏掉必要分支,且不再另存同步布林旗標。
可直接使用的提示詞
套用 principle-model-the-domain。請閱讀檔案上傳器及所有旗標讀寫位置,分析 isUploading、isComplete、hasError 的非法組合。
這輪只提出模型,不改檔案。比較目前布林旗標與最小狀態模型,列出各狀態必要資料、合法事件、轉移擁有者,以及如何處理舊進度回呼。
不要引入狀態管理框架。用成功、失敗、取消、重試的事件序列檢查方案,說明它實際移除了哪些分支、重複規則或生命週期風險。若簡單局部修改就足夠,也要明說。
預期結果與驗收
預期交付狀態與事件對照、資料形狀及消費者調整範圍。
- 模型不能同時表達成功與失敗,必要欄位跟隨對應狀態。
- 每條轉移規則只有一個明確擁有者,畫面不再各自同步旗標。
- 過期事件的處理有明確規則,事件序列能檢查而非只看型別名稱。
- 每個新增抽象都能指出刪除了什麼重複規則、非法狀態或風險。
限制與權限
常見誤用是為簡單流程建立大型框架,或只把旗標包進物件,仍允許所有非法組合。資料結構應減少理解與同步成本,而不是增加間接層。
具型別模型不會自動驗證外部輸入,也不能單靠型別阻止所有過期非同步事件。上傳例子的狀態名稱與轉移是教學方案,不是上游規定的通用狀態表。實作仍須遵守既有取消語意、權限檢查與專案修改範圍。