Clean Code en C++: cómo escribir código que no sea vergonzoso mostrar a tus colegas
Todo desarrollador de C++ tarde o temprano se enfrenta a una situación en la que su propio código se convierte en un "bosque oscuro" después de un mes. Variables como int a, funciones de 300 líneas y números mágicos por todo el proyecto: ¿te suena familiar? En este artículo, desglosaremos los principios de Clean Code aplicados a C++, para que tu código no solo sea funcional, sino también comprensible para otros (y para tu yo futuro).
1. Nombrar variables, funciones y clases
Un buen nombre es la mitad de la batalla. En C++, es común usar camelCase para variables y funciones, PascalCase para clases y UPPER_CASE para constantes (aunque el C++ moderno prefiere constexpr).
Ejemplo malo:
int d; // tiempo transcurrido en díasfloat x; // multiplicador de salariobool fl; // ¿está cargado el archivo?Ejemplo bueno:
int elapsedDays;float salaryMultiplier;bool isFileLoaded;La regla es simple: el nombre debe responder a la pregunta "¿qué es esto?" o "¿qué hace?". Evita las abreviaturas (excepto las comúnmente aceptadas, por ejemplo, idx para índice). Para variables booleanas, usa prefijos como is, has, can.
2. Las funciones deben ser pequeñas y hacer una sola cosa
El principio clásico de Clean Code: una función debe realizar exactamente una tarea. Si no puedes pensar en un nombre corto y claro para una función, es probable que esté haciendo demasiado.
Ejemplo malo:
void processData(std::vector<int>& data) { // ordenamiento std::sort(data.begin(), data.end()); // eliminando duplicados data.erase(std::unique(data.begin(), data.end()), data.end()); // calculando el promedio double sum = 0; for (int val : data) sum += val; double avg = sum / data.size(); // salida std::cout << "Average: " << avg << std::endl;}Ejemplo bueno:
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 función resuelve una tarea, es fácil de probar y reutilizar. La longitud de una función no debe exceder las 20-30 líneas: esta es una buena pauta.
3. Evita los números mágicos y la duplicación
Los números mágicos son números cuyo significado no está claro a partir del contexto. En su lugar, usa constantes con nombre.
Ejemplo malo:
double calculatePrice(double base) { return base * 1.2 + 5.0;}Ejemplo bueno:
constexpr double TAX_RATE = 1.2;constexpr double DELIVERY_FEE = 5.0;
double calculatePrice(double basePrice) { return basePrice * TAX_RATE + DELIVERY_FEE;}Lo mismo se aplica a la duplicación de código. Si copias un bloque de código más de una vez, extráelo a una función. El principio DRY (Don't Repeat Yourself) es la base del código mantenible.
4. Los comentarios no son una excusa para el mal código
El mejor comentario es un código bien escrito que no requiere explicación. Los comentarios deben explicar por qué el código hace algo no obvio, no qué hace.
Ejemplo malo:
Blogs
Book Recommendations
Leer también
Programación asíncrona en Rust: guía práctica completa
Los 10 mejores frameworks PHP para desarrollo web avanzado
Registro en aplicaciones Java: mejores prácticas y herramientas
Algoritmos y estructuras de datos en Go: guía completa para principiantes
Go como pegamento: Integración con Python, C y otros lenguajes