1

テストコードでこのループを見ました:

foreach ( StuffId Id in Result.GetIdList() )
{
    if ( Id.Level == 3 )
    {
        Level3Id = Id.ToString();
    }
    if ( Id.Level == 5 )
    {
        Level5Id = Id.ToString();
    }
}

他のテストでは、各レベルに ID が 1 つしかないか、各レベルに複数の ID がある場合に ID が同じになることが示唆されています。

現在LINQに少し夢中になっているので、最初にこれにリファクタリングしました:

IEnumerable<StuffId> Ids = Result.GetIdList();

Level3Id = Ids.Where( x => x.Level == 3 ).First().Id.ToString();
Level5Id = Ids.Where( x => x.Level == 5 ).First().Id.ToString();

次に、コードの繰り返しが気になったので、これにリファクタリングしました:

IEnumerable<StuffId> Ids = Result.GetIdList();
Func<int,string> IdFromLevel = 
    level => Ids.Where( x => x.Level == level ).First().Id.ToString();

Level3Id = IdFromLevel(3);
Level5Id = IdFromLevel(5);

同僚は、デリゲートの代わりにメソッドを使用しなかった理由を知りませんでした。私の推論は、コレクションを追加で渡す必要があり、デリゲートを使用することは単純なテストでは大したことではないため、メソッドは少し「乱雑」になるということです (簡潔で読みやすく、分岐がないことは良い品質です)。

もちろん、私はSOを見て、この一見関連する質問を見つけました:

C#: メソッドの代わりに Func<>?

コンセンサスは、デリゲートよりもメソッドを支持しているようです。私の場合も同じですか?

4

3 に答える 3

0

私は最初のブロックに行きます:

foreach (StuffId Id in Result.GetIdList())
{
    if (Id.Level == 3)
    {
        Level3Id = Id.ToString();
    }
    if (Id.Level == 5)
    {
        Level5Id = Id.ToString();
    }
}

これにより、コレクションが 1 回だけループされます。ここではパフォーマンスについて心配していないようですが、私にとってはパフォーマンスや最適化の問題ではありません。それは、論理的に正しい方法で何かを行うことの問題です。1 つのステップで実行できるのに、2 回実行する必要はありません (読みやすさが損なわれない場合)。

Func<,>追加の利点は、メソッドと関連する複雑さの間のジレンマがないことです。文字数や入力のしやすさに関しては、縦書きではなく横書き (2 番目のケース) であることを除いて、ほぼ同じです。foreach上記をブロック内に 2 行で記述することもできます。

2 つのアクションを別々に記述したい場合は、この場合、関数が現在のメソッドの範囲外で関連性があるかどうかに基づいて選択します。2つの割り当てにのみ関連する自明な述語であるように私には思えます。だから私は好きです:

var Ids = Result.GetIdList();
Func<int, string> IdFromLevel = level => Ids.Single(x => x.Level == level).Id.ToString();

Level3Id = IdFromLevel(3);
Level5Id = IdFromLevel(5);

Singleここよりも優先First..

于 2013-06-29T08:45:41.433 に答える