我正在閱讀符合 DDD 的 Microsfot 檔案。在驗證部分,它使用這個例子來解釋地址的最終狀態是無效的:
public void SetAddress(string line1, string line2,
string city, string state, int zip)
{
_shippingAddress.line1 = line1 ?? throw new ...
_shippingAddress.line2 = line2;
_shippingAddress.city = city ?? throw new ...
_shippingAddress.state = (IsValid(state) ? state : throw new …);
}
它告訴:如果 state 的值無效,則第一地址行和城市已經更改。這可能會使地址無效。
但我不明白2點:
1.-如果狀態無效,會不會拋出例外,然后地址不會被創建?
2.-地址的第一行,如果我沒有誤解的話,唯一的約束是它必須不為空,但可以接受任何值。如果為null,則拋出例外并且不創建地址。如果不為null,則正確,為什么如果狀態無效,地址的第一行無效?
謝謝。
uj5u.com熱心網友回復:
問題是這里有一些 API - SetAddress() - 允許更改已經存在的送貨地址物件的一部分,而其他的還沒有正確設定。
例如,我可以輕松地將地址line1設定為一個,并在呼叫 SetAddress() 時為城市傳遞 null 。沒有什么可以阻止呼叫者從 SetAddress 捕獲例外并繼續設定地址行 1 但未設定城市。瞧,你有一個不完整的地址,假設沒有城市它是不完整的。
這就是為什么像地址這樣的域概念應該作為一個整體被替換,以不允許不一致的半集物件。如果 SetAddress() 只接受一個地址類實體作為一個洞,并且地址本身只允許創建所有必需的強制值,而這些強制值可以很容易地避免。
這些情況也與值物件和不變性的概念有關。此外,使用值物件可以應對所謂的原始癡迷代碼異味。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507269.html
