0

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 に限定されたものではありません。

4

2 に答える 2

1

まず、ケントは、フィールドを設定すると例外がスローされる理由を疑問に思っています。
その質問を無視します。単純なものを使用できます。

try {
  //do stuff
}
catch (Exception ex) {
  //reset

  //rethrow exception
  throw;
}

各フィールドのリセット値を構成するものに関して、複雑さが生じますか?

  • 最後の値
  • デフォルト値
  • 無効な状態を示すいくつかのトークン値
  • 上記の組み合わせ

最後の値に「リセット」する必要がある場合は、何かを実行する前にオブジェクトの状態を簡単に保存する方法と、問題が発生した場合にその状態を簡単に復元する機能が必要になる可能性があります。その問題に対処するための気の利いた方法でMomentoパターンをチェックしてください。

于 2008-10-07T17:10:04.487 に答える
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
于 2010-07-15T22:56:29.847 に答える