Code review em C#: o que verificar e como dar feedback
\nCode review é uma das ferramentas mais poderosas para melhorar a qualidade do código. Para desenvolvedores C# iniciantes, isso muitas vezes parece estressante: dá medo que seu código seja criticado, ou não fica claro o que exatamente procurar no código alheio. Na verdade, um bom code review é um diálogo, não um exame. Neste artigo, vamos analisar o que observar ao revisar código C# (especialmente no ecossistema .NET) e como formular observações para que ajudem, e não ofendam.
\n\n1. O que verificar no código C#: checklist para o revisor
\nQuando você abre um pull request (PR) de um colega, os olhos se perdem. Para não se afogar em detalhes, use uma abordagem sistemática. Aqui estão as áreas-chave que você precisa verificar em qualquer projeto C#.
\n\n1.1. Arquitetura e legibilidade
\nPrimeiro, avalie o panorama geral. Responda às perguntas:
\n- \n
- Este código resolve o problema proposto? \n
- Ele duplica a lógica existente (princípio DRY)? \n
- Os nomes das classes, métodos e variáveis são claros? \n
Ruim:
\npublic void DoStuff(int a, int b)\n{\n var x = a + b;\n // ... mais 50 linhas\n}\nBom:
\npublic int CalculateTotalPrice(int basePrice, int taxAmount)\n{\n return basePrice + taxAmount;\n}\nO nome do método e dos parâmetros já indicam a finalidade. Isso reduz a carga cognitiva do leitor.
\n\n1.2. Tratamento de erros e segurança contra null
\nC# é uma linguagem com um sistema de tipos avançado, mas NullReferenceException é um problema comum. Verifique:
\n- \n
- As verificações de
nullestão sendo usadas (?.,??,??=)? \n - Há tratamento de exceções (try-catch) onde necessário? \n
- As exceções não estão sendo engolidas em um catch vazio? \n
Exemplo de código perigoso:
\nvar user = GetUserById(id);\nConsole.WriteLine(user.Name); // Erro se user == null\nVersão segura:
\nvar user = GetUserById(id);\nConsole.WriteLine(user?.Name ?? "Convidado");\n\n1.3. Performance e LINQ
\nLINQ é conveniente, mas pode ser ineficiente. Verifique:
\n- \n
- Não está sendo feita uma passagem múltipla pela coleção (por exemplo,
.Where().Select().ToList()em IQueryable)? \n Any()está sendo usado em vez deCount() > 0para verificar a existência de elementos? \n - Não há materializações desnecessárias (
.ToList(),.ToArray()) no meio da cadeia? \n
Ruim:
\nvar list = items.Where(x => x.IsActive).ToList();\nvar first = list.FirstOrDefault();\nMelhor:
\nvar first = items.FirstOrDefault(x => x.IsActive);\n\n1.4. Assincronicidade e Task
\nNo .NET, a assincronicidade é padrão. Observe:
\n- \n
- O
awaitfoi esquecido antes de uma chamada assíncrona? \n - Há chamadas bloqueantes (
.Result,.Wait()) em um contexto síncrono? \n - A convenção é seguida: métodos assíncronos terminam com
Async? \n
Antipadrão:
\nvar data = GetDataAsync().Result; // Pode causar deadlock\nCorreto:
\nvar data = await GetDataAsync();\n\n2. Como dar feedback: de forma suave, mas construtiva
\nMesmo um checklist perfeito é inútil se seus comentários soarem como crítica. Aqui estão algumas regras que ajudarão a tornar o code review útil para todos.
\n\n2.1. Use "mensagens-eu" e perguntas
\nEm vez de "Você escreveu um código ruim", diga "Acho que este método pode ser simplificado. O que você acha?".
\nExemplos de formulações:
\n- \n
- "Não tenho certe