Meilleures façons de formater les requêtes LINQ

Avant d’ignorer / voter pour clore cette question, je considère que c’est une question valable à poser, car la clarté du code est un sujet de discussion important, il est essentiel d’écrire du code maintenable et j’apprécierais beaucoup les réponses .

J’ai récemment rencontré ce problème, les requêtes LINQ peuvent être vraiment désagréables à cause de l’importante imbrication.

Vous trouverez ci-dessous quelques exemples de différences de mise en forme que j’ai mises au point (pour la même requête relativement peu complexe).

Pas de formatage

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

Blocage du formatage

 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 souhaite proposer un format standard pour linq afin de maximiser la lisibilité et la compréhension, tout en ayant un aspect propre et professionnel. Jusqu’ici je ne peux pas décider alors je tourne la question aux professionnels ici.

    J’ai choisi le formatage de bloc. Cela a dérangé mon sentiment de «place perdue» pendant un moment, mais finalement, tout le monde pensait que c’était plus lisible par plus de gens. Comme nous mettions déjà des accolades sur de nouvelles lignes, cela correspondait mieux au rest du code. Il y a aussi moins de place pour l’interprétation. Nous gardons un fichier cs dans la banque publique qui contient des exemples de formatage … quand quelqu’un arrive avec un morceau unique de linq, nous l’ajoutons au fichier … aide vraiment les nouveaux utilisateurs.

    Mon formatage:

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

    Remarques:

    • Ouvrir des méthodes sur des méthodes ne mérite jamais une nouvelle ligne.
    • La fermeture des parens correspond à l’indentation de la ligne contenant l’ouverture paren.
    • Le src => new rest sur la même ligne que Select, car il ne vaut tout simplement pas une nouvelle ligne.
    • Le type anonyme reçoit toujours un traitement de bloc, comme s’il était utilisé en dehors d’une requête (mais la paren fermeture ne mérite pas une nouvelle ligne).
    • La surcharge GroupBy à deux parameters n’est généralement pas appelée. Bien que cela puisse facilement s’ajuster sur une seule ligne, utilisez une ligne supplémentaire pour indiquer clairement que quelque chose d’inhabituel se produit.

    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 la mise en forme de la liste car elle facilite la lecture sans mettre mon code sur des charges de lignes.

    Si j’ai tendance à avoir une déclaration linq assez complexe ou plus large, je vais avec le formatage de blocs afin que les autres puissent lire et suivre plus facilement ce que j’essayais de faire.

    Je ne pense pas que ce soit une mauvaise pratique d’avoir une mise en forme différente pour les différentes déclarations, à condition que vous soyez cohérent avec votre approche.

    C’est très subjectif.

    J’utilise la méthode de mise en forme de bloc.

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