50

この質問を無視/クローズする前に、コードの明確化は議論の重要なトピックであり、保守可能なコードを書くために不可欠であるため、これは有効な質問であると考えています。 .

私は最近、この問題に遭遇しました.LINQクエリは、大量のネストのために非常に厄介なものになる可能性があります.

以下は、私が思いついた書式設定の違いの例です (同じ比較的複雑ではないクエリの場合)。

フォーマットなし

var allInventory = system.InventorySources.Select(src => new { Inventory = src.Value.GetInventory(product.OriginalProductId, true), Region = src.Value.Region }).GroupBy(i => i.Region, i => i.Inventory);

高度な書式設定

var allInventory = system.InventorySources
    .Select(src => 
        new { 
            Inventory = src.Value.GetInventory(product.OriginalProductId, true), 
            Region = src.Value.Region })
                .GroupBy(
                    i => i.Region, 
                    i => i.Inventory);

ブロックの書式設定

var allInventory = system.InventorySources
    .Select(
        src => new 
        { 
            Inventory = src.Value.GetInventory(product.OriginalProductId, true), 
            Region = src.Value.Region 
        })
        .GroupBy(
            i => i.Region, 
            i => i.Inventory
        );

リストの書式設定

var allInventory = system.InventorySources
    .Select(src => new { Inventory = src.Value.GetInventory(product.OriginalProductId, true), Region = src.Value.Region })
    .GroupBy(i => i.Region, i => i.Inventory);

読みやすさと理解を最大化し、きれいでプロフェッショナルに見えるように、linq の書式設定の標準を考え出したいと思います。まだ判断がつかないので、プロの方に質問させてください。

4

4 に答える 4

25

私のフォーマット:

var allInventory = system.InventorySources
  .Select(src => new
  {
    Inventory = src.Value.GetInventory(product.OriginalProductId, true),
    Region = src.Value.Region
  })
  .GroupBy(
    i => i.Region,
    i => i.Inventory
  );

ノート:

  • メソッドの開き括弧は、新しい行に値するものではありません。
  • 閉じ括弧は、開き括弧を含む行のインデントと一致します。
  • src => new は Select と同じ行にとどまります。これは、改行する価値がないためです。
  • 匿名型は、クエリの外で使用された場合と同様に、常にブロック処理されます (ただし、閉じ括弧は改行に値しません)。
  • 通常、2 つのパラメーター GroupBy オーバーロードは呼び出されません。1 行で簡単に収まる場合もありますが、特別な行を使用して、異常なことが起こっていることを明確にします。
于 2010-05-27T21:50:37.193 に答える
14

私はブロックフォーマットに落ち着きました。しばらくの間、「無駄なスペース」の感覚を悩ませましたが、最終的には、より多くの人が読みやすくなったと誰もが感じました. すでに新しい行に中かっこを入れていたので、コードの残りの部分により適しています。解釈の余地も少ない。私たちは、書式設定の例を含む cs ファイルをパブリック ストアに保持しています...誰かが linq のユニークな塊を思いついたとき、私たちはそれをファイルに追加します...新しい人たちを本当に助けます.

于 2010-05-27T20:29:10.197 に答える
3

私にとっては、作成しなければならないクエリの長​​さに依存します。基本的な select や単純な結合などの短い単純なステートメントについては、List Formatting を使用します。これにより、コードを何行にもわたらずに読みやすくすることができます。

かなり複雑な、またはより大きな linq ステートメントを使用する傾向がある場合は、ブロック形式を使用して、他の人が読みやすく、私がやろうとしていたことに従うことができるようにします。

アプローチ方法に一貫性がある限り、ステートメントごとに異なるフォーマットを使用することは悪い習慣ではないと思います。

于 2010-05-27T20:28:41.350 に答える
0

その非常に主観的です。

ブロックフォーマット方式を使用しています。

また、Stylecopに対してコードをチェックし、stylecopの警告が表示されないことを確認します。

于 2010-05-27T20:10:07.220 に答える