8

私は、一連の検証チェックを実行するメソッド内で作業しています。これらのチェックのいずれかが失敗した場合、Action<string>いくつかの一般的な拒否コードを実行するために を呼び出します。セットアップは次のようになります。

public void ValidationMethod() {
    Action<string> rejectionRoutine = (rejectionDescription) => {
        // do something with the reject description
        // other common code
    };

    if (condition != requiredValue) {
        rejectionRoutine("Condition check failed");
        // I currently have to put `return` here following every failed check
    }

    // many more checks following this
}

このシステムでは、1 つのチェックが検証に失敗すると、残りを検証する必要はありません。アクション内で一般的な拒否コードを実行し、メソッドを終了したいだけです。現在これを行うには、returnへの呼び出しに続く次の行で行いますrejectionRoutineAction?の内部から親メソッドの実行を返したり終了したりする機能を組み込む方法があるかどうか疑問に思っています。

私はこれが少しうるさいことを知っていますが、他の誰かが追加の検証チェックを追加する必要がある場合(彼らはリターンをあちこちに置くことを気にする必要はありません)、さらに先の拡張性のためにも良いと思います.これらのケースに共通であると思われるコード内で実行を終了する一般的な動作をカプセル化するものとして。

4

3 に答える 3

7

コードを少しきれいにする 1 つの方法は、すべてのチェックアウトをコレクションに外挿することです。

Dictionary<Func<bool>, string> checks = new Dictionary<Func<bool>, string>()
{
    {()=> condition != requiredValue, "Condition check failed"},
    {()=> otherCondition != otherRequiredValue, "Other condition check failed"},
    {()=> thirdCondition != thirdRequiredValue, "Third condition check failed"},
};

チェックを特定の順序で実行することが重要な場合 (このコードの順序は予測できません)、List<Tuple<Func<bool>, string>>代わりに a のようなものを使用する必要があります。

var checks = new List<Tuple<Func<bool>, string>>()
{
    Tuple.Create<Func<bool>, string>(()=> condition != requiredValue
        , "Condition check failed"),
    Tuple.Create<Func<bool>, string>(()=> otherCondition != otherRequiredValue
        , "Other condition check failed"),
    Tuple.Create<Func<bool>, string>(()=> thirdCondition != thirdRequiredValue
        , "Third condition check failed"),
};

その後、LINQ を使用して検証を行うことができます。

var failedCheck = checks.FirstOrDefault(check => check.Item1());
if (failedCheck != null)
    rejectionRoutine(failedCheck.Item2);
于 2013-05-14T14:05:20.387 に答える
0

SLaks ソリューションの代わりにrejectionRoutine、設計で許可されている場合は例外をスローすることもできます。

于 2013-05-14T13:58:54.387 に答える