分析 class 改為 struct 的理由:資料導向、無行為、小型資料傳值效能較好。接著揭示兩大問題:
- 資料不一致:屬性賦值中途拋出例外,導致部分欄位已修改、部分未修改(如 Zip 驗證失敗,City 已改、Province 未改)。多執行緒下同樣可讀取到中間狀態。
- 可變性:物件建立後仍可任意修改單一欄位,違背領域模型完整性。
核心定義
- 原子性:物件狀態為整體,要麼全改、要麼全不改。
- 常量性(不可變性):物件建立後狀態凍結,需變更時建立新實例。
下篇將展示以 readonly、建構函數、移除 setter 解決上述問題。