Clean Code em C#: princípios e exemplos na prática
Código limpo (Clean Code) não é apenas um termo da moda, mas uma habilidade fundamental para o desenvolvedor profissional. No ecossistema .NET e C#, onde os projetos frequentemente duram anos e são mantidos por dezenas de programadores, a capacidade de escrever código compreensível e facilmente modificável torna-se criticamente importante. Neste artigo, vamos analisar os principais princípios do Clean Code aplicados ao C# e examinar exemplos concretos de sua aplicação.
Por que o código limpo é importante em C#?
C# é uma linguagem fortemente tipada, orientada a objetos e com um ecossistema rico. No entanto, seu poder pode se transformar em caos se não houver disciplina. O código limpo reduz o número de bugs, acelera a integração de novos desenvolvedores e diminui o custo de manutenção. Como disse Robert Martin: "A única maneira de escrever código rápido é escrevê-lo bem".
Princípio 1: Nomes significativos
Os nomes de variáveis, métodos e classes devem revelar a intenção. Não economize caracteres — código ruim exige mais tempo para ser compreendido.
Exemplo ruim
int d; // tempo desde a alteraçãoList<int> lst = new List<int>();void Proc(int a, int b) { ... }Exemplo bom (Clean Code)
int elapsedTimeInDays;List<int> customerIds = new List<int>();void CalculateDiscount(decimal basePrice, decimal taxRate) { ... }Regra: Se um nome precisa de comentário, significa que ele é ruim. Use camelCase para variáveis e PascalCase para métodos e classes.
Princípio 2: Funções pequenas (SRP no nível de métodos)
Cada função deve fazer exatamente uma coisa e fazê-la bem. Se um método contém mais de 20-30 linhas ou tem mais de dois níveis de aninhamento — é um sinal para refatoração.
Exemplo ruim: função canivete suíço
public void ProcessOrder(Order order){ // Validação if (order == null || order.Items.Count == 0) throw new ArgumentException("Invalid order");
// Cálculo de desconto decimal discount = 0; if (order.Total > 1000) discount = 0.1m; else if (order.Total > 500) discount = 0.05m;
// Salvamento no BD using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges();
// Envio de email SendEmail(order.CustomerEmail, "Order received");}Exemplo bom: separação de responsabilidades
public void ProcessOrder(Order order){ Validate(order); var discount = CalculateDiscount(order.Total); ApplyDiscount(order, discount); SaveOrder(order); SendConfirmationEmail(order);}
private void Validate(Order order){ if (order == null || order.Items.Count == 0) throw new ArgumentException("Invalid order");}
private decimal CalculateDiscount(decimal total){ if (total > 1000) return 0.1m; if (total > 500) return 0.05m; return 0;}
private void SaveOrder(Order order){ using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges();}Princípio 3: Evite duplicação (DRY)
Código repetido é a raiz de todos os males. Se você copia um bloco de código mais de uma vez, extraia-o para um método ou classe.
Exemplo: lógica duplicada
// No controller de usuáriosif (user.Role == "Admin" || user.Role == "Manager") GrantAccess();
// No controller de relatóriosif (user.Role == "Admin" || user.Role == "Manager") ShowReport();Refatoração: encapsulamento da verificação
public static class UserExtensions{ public static bool HasElevatedPermissions(this User user) { return user.Role == "Admin" || user.Role == "Manager"; }}
// Usoif (user.HasElevatedPermissions()) GrantAccess();