3

ビューにラベルを表示するかどうかを示す大きなハンドラーメソッドをクリーンアップしようとしています。

実際の構造は次のようなものです。

if (Moo.Foo != null) {
    Show(TrType, LabelType, Moo.Foo.DangerousNullRef + " - " + Moo.Foo.AnotherPossibleNullRef);
}
else {
    DontShowField(TrType);
}

私は、関係するすべてのコンポーネントを、すべての退屈なことを行うメソッドに送信するようなものを考えていますが、次のようになります。

ShowHandlingNull(Moo.Foo != null, TrType, LabelType, Moo.Foo.DangerousNullRef + " - " + Moo.Foo.AnotherPossibleNullRef);

Moo.Fooがnullの場合、null参照が発生します。動作を委任または実行して、大きなメソッドに1行だけ入れることはできますか?

4

6 に答える 6

1

これは改善とは思いませんが、ラムダによる遅延実行を使用して実行できます。

ShowHandlingNull(Moo.Foo, TrType, LabelType, f => f.DangerousNullRef, f => f.AnotherPossibleNullRef);

void ShowHandlingNull(Foo foo, object trType, objectLablelType, Func<Foo, object> dangerousNullRefGetter, Funct<Foo, object> anotherDangerousGetter)
{
    if (foo == null) {
        DontShowField(trType);
        return;
    }
    Show(TrType, LabelType, dangerousNullRefGetter(foo) + " - " + anotherDangerousGetter(foo));
}

ifただし、元のnullチェックの方が理解と保守が簡単だと思います。

于 2011-08-11T13:56:09.613 に答える
1

Funcを使用してこれを処理するというアイデアはすでにありますが、これは私にとって最良の解決策のように思えます。私はあなたの意図にいくつかの仮定を立て、あなたがそのラベルテキストを取得しようとしていると仮定したので、そのように書きました。

   private void YourFunction
    {
        Type TrType = this.GetType();
        MooClass Moo = new MooClass();
        LabelTypeEnum LabelType = LabelTypeEnum.something;
        ShowIf(Moo, TrType, LabelType, new Object[] { Moo.Foo, Moo.Foo2, Moo.Foo3 }, a => a.Foo.DangerousNullRef + " - " + a.Foo.AnotherPossibleNullRef);

    }


    void ShowIf(MooClass Moo, Type t, LabelTypeEnum LabelType, IEnumerable<object> PreCheckNullsValues, Func<MooClass, string> mc )
    {
        if (PreCheckNullsValues.Any(a => a == null))
            Show(t, LabelType, mc(Moo));
        else
            DontShowField(t);
    }

サポートするコードの想定されるスケルトンは次のとおりです。

   enum LabelTypeEnum
    {
        something
    }

    class MooClass
    {
        public FooClass Foo { get; set; }
    }

    class FooClass
    {
        public object DangerousNullRef { get; set; }
        public object AnotherPossibleNullRef { get; set; }
    }

    private void Show(Type TrType, LabelTypeEnum LabelType, string p) { }

    private void DontShowField(Type TrType) { }

その後、アクションを使用してプロパティに安全にアクセスできます。

于 2011-08-11T14:37:33.867 に答える
1

NullObjectパターンのガイドラインに従うことができます。

たとえば、Moo.Fooはインターフェイスになる可能性があり、実際のクラスはそのインターフェイスの実装になる必要があります。次に、Fooがnullの場合を処理するMooFooNullクラス、つまりDontShowFieldメソッドを作成します。

// On Moo.Foo initialization, if the condition for creating of RealMooFoo are not met.
Moo.Foo = new MooFooNull(this);

// later on ...
Moo.Foo.Show(TrType, LabelType, Moo.Foo.DangerousNullRef + " - " + Moo.Foo.AnotherPossibleNullRef);

ここで、MooFooNullのShowメソッドは次のとおりです。

void Show(TheClass theClass, object trType, ... ) {
    theClass.DontShowField(trType);
}
于 2011-08-11T14:09:42.107 に答える
0

Strings "+"のように動作し、null-Referencesをチェックする(そしてそれを文字列への拡張メソッドとして追加する)メソッドを自分で作成することもできますが、これはやり過ぎだと思います。「Moo」(タイプが何であれ)パラメーターを使用してshow-methodを変更/オーバーロードし、そこでチェックインするだけです。

于 2011-08-11T13:58:08.837 に答える
0

nullを受け入れる拡張メソッドを試してみませんか

public static string ShowHandlingNull(this Foo foo, TrType trType, LabelType labelType)
{
    if (foo == null)
    {
        return string.Empty;
    }
    return ......
}

var result = Moo.Foo.ShowHandlingNull(trType, labelType);
于 2011-08-11T14:00:11.580 に答える
0

小さな拡張メソッドを使用します。

public static class OrEmpty<T>(this T instance) where T : class, new()
{
    return instance ?? new T();
}

例:

Show(TrType, LabelType, Moo.Foo.OrEmpty().DangerousNullRef + " - " + Moo.Foo.OrEmpty().AnotherPossibleNullRef);

呼び出しごとに新しいオブジェクトが作成されることに注意してください。多くのオブジェクトを作成しないように、少し高度にすることができます。

于 2011-08-11T14:07:22.713 に答える