Por que código limpo em C++ não é sobre pedantismo, mas sobre respeito
Se você já abriu um projeto escrito "de qualquer jeito" há um ano e não conseguiu entender o que faz uma função chamada doStuff() — você sabe do que estamos falando. Código limpo em C++ não é apenas estética. É economia de tempo, nervos e dinheiro. C++ é uma linguagem poderosa, mas também traiçoeira: a memória é gerenciada manualmente, os templates podem gerar monstros e a sobrecarga de operadores pode ser mágica pura. Sem disciplina, o código rapidamente se transforma em "espaguete".
Neste artigo, vamos abordar como escrever código limpo em C++ para que seja fácil de ler, manter e expandir. Sem enrolação — apenas prática, exemplos e princípios comprovados.
Regra nº1: Nomenclatura é 50% do sucesso
Os nomes de variáveis, funções e classes devem responder à pergunta "o que é isso?" ou "o que faz?". Esqueça int x e void f(). Use nomes significativos.
Exemplo ruim
int d; // o que é d? distância? data? idiota?void p() { // imprime? analisa? chora? // ...}Exemplo bom
int distanceInMeters;void printUserProfile() { // ...}Dica: Mantenha um estilo consistente. Para C++, o padrão é camelCase para variáveis e funções, PascalCase para classes. Não misture snake_case e camelCase no mesmo projeto — isso reduz a legibilidade.
Regra nº2: Funções devem ser pequenas e fazer uma única coisa
O princípio da responsabilidade única (Single Responsibility) funciona não apenas para classes, mas também para funções. A função ideal tem de 5 a 20 linhas. Se uma função faz mais de uma ação — divida-a.
Ruim
void processData(vector<int>& data) { // ordenação sort(data.begin(), data.end()); // filtragem vector<int> filtered; for (int x : data) if (x > 0) filtered.push_back(x); // saída for (int x : filtered) cout << x << " ";}Bom
vector<int> filterPositive(const vector<int>& data) { vector<int> result; for (int x : data) if (x > 0) result.push_back(x); return result;}
void printData(const vector<int>& data) { for (int x : data) cout << x << " ";}
void processData(vector<int>& data) { sort(data.begin(), data.end()); auto filtered = filterPositive(data); printData(filtered);}Agora cada função pode ser reutilizada e testada separadamente. Código limpo em C++ é modularidade.
Regra nº3: Evite números mágicos e strings
Números e strings cujo valor não é claro pelo contexto são um mal. Coloque-os em constantes.
Ruim
if (temperature > 100) { cout << "Perigo!";}Bom
constexpr int MAX_SAFE_TEMPERATURE = 100;
if (temperature > MAX_SAFE_TEMPERATURE) { cout << "Perigo!";}Agora, se o limite mudar, você altera em um único lugar. Em vez de procurar todos os 100 pelo código.
Regra nº4: Comentários não são desculpa para código ruim
O melhor comentário é aquele que não é necessário, porque o código fala por si só. Não escreva "o que o código faz" — isso é óbvio. Escreva "por que ele faz isso".
Comentário ruim
// incrementa i em 1i++;Comentário bom
// Usamos pré-incremento para tipos POD — mais rápido++i;Use // TODO: para partes incompletas, mas não abuse. O código ideal não requer explicações.
Regra nº5: Use RAII e ponteiros inteligentes
C++ é famoso pelo gerenciamento manual de memória, mas no C++ moderno (C++11 e posteriores) existem ferramentas poderosas