Code review en C#: qué revisar y cómo dar retroalimentación
Code review no es solo una formalidad, sino uno de los procesos clave que garantizan la calidad del código. Esto es especialmente importante en proyectos de C# y .NET, donde el alto rendimiento, la legibilidad y el cumplimiento de estándares modernos juegan un papel crucial. En este artículo analizaremos qué aspectos revisar al hacer code review de código C# y cómo dar retroalimentación útil y constructiva.
1. Arquitectura y cumplimiento de principios SOLID
Antes de revisar líneas de código específicas, evalúa la arquitectura general. En C# esto es especialmente importante debido al uso extensivo de POO.
- Single Responsibility: cada clase y método debe resolver una sola tarea. Si un método hace demasiado, es motivo de revisión.
- Open/Closed: verifica si se puede ampliar la funcionalidad sin modificar el código existente (por ejemplo, mediante interfaces o clases abstractas).
- Dependency Injection: en .NET Core/5+ DI es el estándar. Asegúrate de que las dependencias se pasen a través del constructor, no se creen dentro de la clase.
// Mal: violación de SRP y DIpublic class OrderService{ private readonly SqlConnection _connection = new SqlConnection("..."); public void ProcessOrder(Order order) { // Lógica de validación // Lógica de guardado en BD // Lógica de envío de email }}
// Bien: separación en servicios y 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. Seguridad y manejo de errores
La seguridad es una parte crítica de cualquier aplicación en C#. Presta atención a los siguientes aspectos:
- Inyección SQL: usa consultas parametrizadas o Entity Framework, no concatenación de cadenas.
- Excepciones: no tragues excepciones con
catchvacíos. Registra los errores y usafinallypara liberar recursos. - Null-safety: en C# 8+ usa nullable reference types. Verifica que los argumentos de métodos no sean
null.
// Mal: vulnerable a inyección SQLvar query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
// Bien: consulta parametrizadavar command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection);command.Parameters.AddWithValue("@name", userName);También verifica que la aplicación maneje correctamente las excepciones en los límites del sistema (por ejemplo, en controladores ASP.NET Core).
3. Rendimiento y gestión de memoria
C# es un lenguaje con gestión automática de memoria, pero eso no significa que puedas olvidarte del rendimiento. Al hacer code review, presta atención a:
- Consultas LINQ: evita múltiples iteraciones sobre colecciones. Por ejemplo,
.ToList()después de cada.Where()puede ralentizar seriamente el rendimiento. - Asincronía: usa
async/awaitpara operaciones de I/O, pero no abuses de.Resulto.Wait()— esto puede causar deadlocks. - Pool de objetos: para objetos pesados (como conexiones a BD) usa pooling, no los crees cada vez.
// Mal: múltiples iteracionesvar filtered = items.Where(x => x.IsActive).ToList();var sorted = filtered.OrderBy(x => x.Name).ToList