Code review en C# : quoi vérifier et comment donner un retour
Le code review n'est pas une simple formalité, mais l'un des processus clés garantissant la qualité du code. C'est particulièrement important pour les projets en C# et .NET, où la haute performance, la lisibilité et la conformité aux normes modernes jouent un rôle crucial. Dans cet article, nous allons voir sur quoi se concentrer lors de la revue de code C# et comment donner un retour utile et constructif.
1. Architecture et respect des principes SOLID
Avant d'examiner les lignes de code spécifiques, évaluez l'architecture globale. En C#, c'est particulièrement important en raison de l'utilisation intensive de la POO.
- Single Responsibility : chaque classe et méthode doit résoudre une seule tâche. Si une méthode en fait trop, c'est une raison pour une revue.
- Open/Closed : vérifiez si la fonctionnalité peut être étendue sans modifier le code existant (par exemple, via des interfaces ou des classes abstraites).
- Dependency Injection : dans .NET Core/5+, l'injection de dépendances est la norme. Assurez-vous que les dépendances sont transmises via le constructeur, et non créées à l'intérieur de la classe.
// Mauvais : violation du SRP et de la DIpublic class OrderService{ private readonly SqlConnection _connection = new SqlConnection("..."); public void ProcessOrder(Order order) { // Logique de validation // Logique de sauvegarde en BDD // Logique d'envoi d'email }}
// Bon : séparation en services et DIpublic class OrderService{ private readonly IOrderRepository _orderRepository; private readonly IEmailService _emailService;
public OrderService(IOrderRepository orderRepository, IEmailService emailService) { _orderRepository = orderRepository; _emailService = emailService; }
public void ProcessOrder(Order order) { _orderRepository.Save(order); _emailService.SendConfirmation(order); }}2. Sécurité et gestion des erreurs
La sécurité est une partie critique de toute application en C#. Faites attention aux aspects suivants :
- Injection SQL : utilisez des requêtes paramétrées ou Entity Framework, plutôt que la concaténation de chaînes.
- Exceptions : n'avalez pas les exceptions avec des blocs
catchvides. Enregistrez les erreurs et utilisezfinallypour libérer les ressources. - Sécurité null : en C# 8+, utilisez les types de référence nullables. Vérifiez les arguments des méthodes pour
null.
// Mauvais : vulnérabilité aux injections SQLvar query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
// Bon : requête paramétréevar command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection);command.Parameters.AddWithValue("@name", userName);Vérifiez également que l'application gère correctement les exceptions aux limites du système (par exemple, dans les contrôleurs ASP.NET Core).
3. Performance et gestion de la mémoire
C# est un langage avec gestion automatique de la mémoire, mais cela ne signifie pas que vous pouvez oublier la performance. Lors de la revue, faites attention à :
- Requêtes LINQ : évitez les itérations multiples sur les collections. Par exemple,
.ToList()après chaque.Where()peut considérablement ralentir le travail. - Asynchronisme : utilisez
async/awaitpour les opérations d'E/S, mais n'abusez pas de.Resultou.Wait()— cela peut provoquer un deadlock. - Pool d'objets : pour les objets lourds (par exemple, les connexions à la BDD), utilisez le pooling plutôt que de les créer à chaque fois.
// Mauvais : itérations multiplesvar filtered = items.Where(x => x.IsActive).ToList();var sorted = filtered.OrderBy(x => x.Name).ToList