Clean Code em C++: como escrever código que não é vergonha mostrar aos colegas
Todo desenvolvedor C++ mais cedo ou mais tarde enfrenta uma situação em que o próprio código se transforma em uma "floresta escura" depois de um mês. Variáveis como int a, funções com 300 linhas e números mágicos por todo o projeto — familiar? Neste artigo, vamos analisar os princípios do Clean Code aplicados ao C++, para que seu código não seja apenas funcional, mas também compreensível para outros (e para você no futuro).
1. Nomenclatura de variáveis, funções e classes
Um bom nome já é metade do trabalho. Em C++, é comum usar camelCase para variáveis e funções, PascalCase para classes e UPPER_CASE para constantes (embora no C++ moderno se prefira constexpr).
Exemplo ruim:
int d; // elapsed time in daysfloat x; // salary multiplierbool fl; // is file loaded?Exemplo bom:
int elapsedDays;float salaryMultiplier;bool isFileLoaded;A regra é simples: o nome deve responder à pergunta "o que é isso?" ou "o que faz?". Evite abreviações (exceto as amplamente aceitas, como idx para índice). Para variáveis booleanas, use os prefixos is, has, can.
2. Funções devem ser pequenas e fazer uma única coisa
O princípio clássico do Clean Code — uma função deve executar exatamente uma tarefa. Se você não consegue pensar em um nome curto e claro para a função — provavelmente ela está fazendo demais.
Exemplo ruim:
void processData(std::vector<int>& data) { // ordenação std::sort(data.begin(), data.end()); // remoção de duplicatas data.erase(std::unique(data.begin(), data.end()), data.end()); // cálculo da média double sum = 0; for (int val : data) sum += val; double avg = sum / data.size(); // saída std::cout << "Average: " << avg << std::endl;}Exemplo bom:
std::vector<int> sortAndUnique(std::vector<int> data) { std::sort(data.begin(), data.end()); data.erase(std::unique(data.begin(), data.end()), data.end()); return data;}
double calculateAverage(const std::vector<int>& data) { if (data.empty()) return 0.0; double sum = std::accumulate(data.begin(), data.end(), 0.0); return sum / data.size();}
void printAverage(const std::vector<int>& data) { auto processed = sortAndUnique(data); double avg = calculateAverage(processed); std::cout << "Average: " << avg << std::endl;}Cada função resolve uma única tarefa, é facilmente testável e reutilizável. O tamanho da função não deve exceder 20-30 linhas — este é um bom parâmetro de referência.
3. Evite números mágicos e duplicação
Números mágicos são números cujo valor não é claro pelo contexto. Em vez deles, use constantes nomeadas.
Exemplo ruim:
double calculatePrice(double base) { return base * 1.2 + 5.0;}Exemplo bom:
constexpr double TAX_RATE = 1.2;constexpr double DELIVERY_FEE = 5.0;
double calculatePrice(double basePrice) { return basePrice * TAX_RATE + DELIVERY_FEE;}O mesmo se aplica à duplicação de código. Se você copia um bloco de código mais de uma vez — extraia-o para uma função. A regra DRY (Don't Repeat Yourself) é a base de um código sustentável.
4. Comentários não são desculpa para código ruim
O melhor comentário é um código bem escrito que não requer explicações. Comentários devem explicar por que o código faz algo não óbvio, e não o que ele faz.
Exemplo ruim:
Blogs
Book Recommendations
Leia também
Metaprogramação em PHP: técnicas avançadas para desenvolvedores
WebAssembly e Go: Criando aplicações web ultrarrápidas
«Use of moved value» em Rust: como corrigir e não enlouquecer
Conversão segura de números em Rust: guia completo para iniciantes
Concorrência e Multithreading em Rust: Técnicas Avançadas