Если у меня есть объект Address, который реализует IEditableObject, у меня может быть реализация 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;
}
}
Если есть исключение, обновляющее, например, _состояние, тогда все 5 свойств должны быть сброшены. Эта проблема с атомарным обновлением, вероятно, не ограничивается EndEdit.





Во-первых, Кент прав, задаваясь вопросом, почему установка поля вызывает исключение. Игнорируя этот вопрос; вы можете просто использовать простой:
try {
//do stuff
}
catch (Exception ex) {
//reset
//rethrow exception
throw;
}
Сложности возникают в отношении того, что составляет значение сброса для каждого поля?
Если вам нужно «сбросить» до последнего значения, вам, вероятно, понадобится какой-то способ легко сохранить состояние объекта, прежде чем что-то с ним делать, а также возможность легко восстановить это состояние, если что-то пойдет не так. Ознакомьтесь с Шаблон Momento, чтобы узнать об отличном способе решения этой проблемы.
Я не использую поля для хранения значений. Вместо этого я использую хеш-таблицу, которую свойства могут читать и записывать. Это дает мне действительно простой дизайн.
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
«Сброс» будет означать последнее значение. Зачем нам вообще возвращаться к значениям по умолчанию? Я не уверен насчет недействительных токенов. Я обязательно проверю шаблон Memento, несмотря ни на что - спасибо!