Code review em C#: o que verificar e como dar feedback
Code review não é apenas uma formalidade, mas um dos processos-chave que garantem a qualidade do código. Isso é especialmente importante para projetos em C# e .NET, onde alta performance, legibilidade e conformidade com padrões modernos desempenham um papel crucial. Neste artigo, vamos analisar o que observar ao revisar código C# e como dar feedback para que seja útil e construtivo.
1. Arquitetura e conformidade com princípios SOLID
Antes de olhar para linhas específicas de código, avalie a arquitetura geral. Em C#, isso é especialmente importante devido ao uso extensivo de OOP.
- Single Responsibility: cada classe e método deve resolver uma única tarefa. Se um método faz demais — é motivo para revisão.
- Open/Closed: verifique se é possível estender a funcionalidade sem alterar o código existente (por exemplo, através de interfaces ou classes abstratas).
- Dependency Injection: em .NET Core/5+ DI é padrão. Certifique-se de que as dependências são passadas através do construtor, e não criadas dentro da classe.
// Ruim: violação de SRP e DIpublic class OrderService{ private readonly SqlConnection _connection = new SqlConnection("..."); public void ProcessOrder(Order order) { // Lógica de validação // Lógica de salvamento no BD // Lógica de envio de email }}
// Bom: separação em serviços e 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. Segurança e tratamento de erros
Segurança é uma parte crítica de qualquer aplicação em C#. Preste atenção aos seguintes aspectos:
- SQL Injection: use consultas parametrizadas ou Entity Framework, em vez de concatenação de strings.
- Exceções: não engula exceções com
catchvazios. Registre erros e usefinallypara liberar recursos. - Null-safety: em C# 8+, use nullable reference types. Verifique argumentos de métodos para
null.
// Ruim: vulnerabilidade a SQL Injectionvar query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
// Bom: consulta parametrizadavar command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection);command.Parameters.AddWithValue("@name", userName);Também verifique se a aplicação trata corretamente as exceções nos limites do sistema (por exemplo, em controllers ASP.NET Core).
3. Performance e gerenciamento de memória
C# é uma linguagem com gerenciamento automático de memória, mas isso não significa que se possa esquecer da performance. Ao revisar, observe:
- Consultas LINQ: evite múltiplas iterações em coleções. Por exemplo,
.ToList()após cada.Where()pode desacelerar seriamente o funcionamento. - Assincronicidade: use
async/awaitpara operações de I/O, mas não abuse de.Resultou.Wait()— isso pode causar deadlock. - Object pool: para objetos pesados (por exemplo, conexões com BD), use pooling em vez de criá-los toda vez.
// Ruim: múltiplas iteraçõesvar filtered = items.Where(x => x.IsActive).ToList();var sorted = filtered.OrderBy(x => x.Name).ToList