如果我有一个实现IEditableObject的Address对象,我可能会有这样的EndEdit实现:
public void EndEdit()
{
// BeginEdit would set _editInProgress and update *Editing fields;
if (_editInProgress)
{
_line1 = _line1Editing;
_line2 = _line2Editing;
_city = _cityEditing;
_state = _stateEditing;
_postalCode = _postalCodeEditing;
_editInProgress = false;
}
}
例如,如果有更新 _state 的异常,则应重置所有5个属性。此原子更新问题可能不仅限于EndEdit。
答案 0 :(得分:1)
首先,Kent想知道为什么设置一个字段会抛出异常是正确的 无视这个问题;你可以使用一个简单的:
try {
//do stuff
}
catch (Exception ex) {
//reset
//rethrow exception
throw;
}
每个领域的复位值是什么构成了复杂性?
如果你需要“重置”到最后一个值,那么在做某事之前你可能想要一些方法来轻松存储对象状态,以及在出现问题时能够轻松恢复该状态的能力。以一种漂亮的方式查看Momento Pattern以解决该问题。
答案 1 :(得分:0)
我不使用字段来存储值。相反,我使用属性可以读写的哈希表。这给了我一个非常简单的设计。
Friend Sub BeginEdit()
m_Backup = New Dictionary(Of String, Object)(m_DataPoints, StringComparer.OrdinalIgnoreCase)
End Sub
Friend Sub CancelEdit()
If m_Backup IsNot Nothing Then m_DataPoints = m_Backup
End Sub
Friend Sub EndEdit()
m_Backup = Nothing
End Sub