Meilleures façons de formater les requêtes LINQ

Avant d'ignorer / voter-pour-fermer cette question, je considère que c'est une question valide à poser parce que la clarté du code est un sujet de discussion important, il est essentiel d'écrire du code maintenable et j'apprécierais grandement les réponses de ceux qui ont rencontré cela auparavant.

J'ai récemment rencontré ce problème, les requêtes LINQ peuvent devenir très désagréables en raison de la grande quantité d'imbrication.

Voici quelques exemples de différences dans formatage que j'ai trouvé (pour la même requête relativement non complexe)

Pas De Mise En Forme

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);

Mise En Forme Élevée

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);

Formatage Des Blocs

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
        );

Mise En Forme De Liste

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);

Je veux proposer un standard pour le formatage linq afin qu'il maximise la lisibilité et la compréhension et semble propre et professionnel. Jusqu'à présent, je ne peux pas décider alors je tourne la question aux professionnels ici.

39
demandé sur Aren 2010-05-28 00:07:06

4 réponses

Je me suis installé sur le formatage de bloc. Cela a dérangé mon sens de "l'espace gaspillé" pendant un certain temps, mais finalement tout le monde a estimé qu'il était plus lisible par Plus de gens. Comme nous mettions déjà des accolades sur de nouvelles lignes, cela correspond mieux au reste du code. Il y a aussi moins de place pour l'interprétation. Nous conservons un fichier cs dans le magasin public qui a des exemples de formatage...quand quelqu'un arrive avec un morceau unique de linq nous l'ajoutons au fichier...ça aide vraiment les nouveaux.

10
répondu Rusty 2010-05-27 20:29:10

MA Mise En Forme:

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
  );

Notes:

  • ouvrir des parens sur des méthodes ne sont jamais dignes d'une nouvelle ligne.
  • les paramètres de fermeture correspondent à l'indentation de la ligne contenant le paramètre d'ouverture.
  • Le src = > new reste sur la même ligne que Select, car il n'est tout simplement pas digne d'une nouvelle ligne.
  • le type anonyme reçoit toujours un traitement de bloc, tout comme s'il était utilisé en dehors d'une requête (mais le paren de fermeture n'est pas digne d'une nouvelle ligne).
  • Les deux paramètres La surcharge GroupBy n'est généralement pas appelée. Bien qu'il puisse s'adapter facilement sur une seule ligne, utilisez une ligne supplémentaire pour préciser que quelque chose d'inhabituel se passe.
17
répondu Amy B 2012-11-20 02:53:39

Pour moi, cela dépend de la longueur de la requête que je dois faire. Pour de courtes instructions simples comme une sélection de base ou des jointures simples, je vais aller avec le formatage de la liste, car cela le rend agréable et facile à lire sans mettre mon code sur des charges de lignes.

Si j'ai tendance à avoir une instruction linq plutôt complexe ou plus grande, je vais avec le formatage de bloc afin qu'il soit plus facile pour les autres de lire et de suivre ce que j'essayais de faire.

Je ne pense pas que ce soit une mauvaise pratique d'avoir différents mise en forme pour différentes instructions tant que vous êtes cohérent avec la façon dont vous l'abordez.

3
répondu Richard Reddy 2010-05-27 20:28:41

C'est très subjectif.

J'utilise la méthode de formatage de bloc.

Je vérifie également le code contre Stylecop et je m'assure qu'il ne génère aucun avertissement stylecop.

0
répondu Pierre-Alain Vigeant 2012-11-20 03:03:14