そのため、C# コード コントラクトと同様に、スコープ ガードまたは同様のメカニズムを使用して、着信/発信オブジェクトの有効性や内部状態の不変性を確保する方法を調査しています。
通常の処理中に予期しない条件/例外が発生し、一部のオブジェクトが一貫性のない状態のままになる特定のケースでは、スコープガードが文句を言うという事実を回避するためにどのメカニズムを使用できるか/使用する必要がありますか?関数から飛び出すときは?
私の要点を説明するためのサンプル疑似コードを次に示します。
struct IObjectValidator;
struct ObjectValidatorScopeGuard
{
ObjectValidatorScopeGuard(IObjectValidator * pObj)
: m_ptr(pObj)
{
Assert(!m_ptr || m_ptr->isValid());
}
~ObjectValidatorScopeGuard()
{
Assert(!m_ptr || m_ptr->isValid());
}
private:
IObjectValidtor * m_ptr;
};
int SomeComponent::CriticalMethod(const ThingA& in, ThingB& inout, ThingC * out)
{
ObjectValidatorScopeGuard sg1(static_cast<IObjectValidator *>(&in));
ObjectValidatorScopeGuard sg2(static_cast<IObjectValidator *>(&inout));
ObjectValidatorScopeGuard sg3(static_cast<IObjectValidator *>(out));
// create out
try
{
out = new ThingC();
out->mergeFrom(inout, out); // (1)
}
catch (const EverythingHasGoneHorriblyWrongException& ex)
{
// (2) out and inout not guaranteed valid here..
}
return 0;
}
したがって、(1) で何か問題が発生し、ポイント (2) で「out」または「inout」が悪い状態になると、スコープ ガード sg2/sg3 は例外をスローします...そしてそれらの例外は、真の原因。
このシナリオで動作するパターン/規則はありますか? 明らかな何かが欠けていますか?