Code Review en C++: qué revisar y cómo dar retroalimentación
El code review (revisión de código) es una etapa obligatoria del desarrollo, especialmente en C++. Este lenguaje ofrece una gran libertad, pero con ella viene la responsabilidad. Para los desarrolladores principiantes, el proceso de revisión puede parecer intimidante, pero en realidad es una poderosa herramienta de aprendizaje. En este artículo, analizaremos en qué fijarse al revisar código C++ y cómo dar retroalimentación para que sea útil, no ofensiva.
1. Corrección básica y seguridad de la memoria
Lo primero que hay que verificar en cualquier código C++ es la corrección en el manejo de la memoria. C++ no tiene un recolector de basura, por lo que los errores aquí son críticos.
Qué revisar:
- Fugas de memoria: Cada
newdebe tener su correspondientedelete, cadanew[]sudelete[]. Es mejor usar punteros inteligentes (std::unique_ptr,std::shared_ptr). - Desbordamiento de arrays: Usar
std::vector::at()en lugar del operador[]para detectar errores. - Punteros colgantes: Punteros que referencian memoria ya liberada.
- Doble liberación: Un
deleterepetido para un mismo bloque de memoria.
// Malo: gestión manual de memoriaint* arr = new int[100];// ... trabajo ...delete[] arr; // Fácil de olvidar
// Bueno: usamos RAIIstd::vector<int> arr(100);// La memoria se liberará automáticamenteConsejo para el revisor: Si ve punteros crudos (int* ptr) o new/delete manuales, es una bandera roja. Sugiera usar std::unique_ptr o contenedores de la STL.
2. Uso de la biblioteca estándar (STL)
C++20/23 proporcionan una rica biblioteca estándar. Los principiantes a menudo reinventan la rueda donde podrían usar soluciones ya hechas.
Lista de verificación:
- Contenedores: En lugar de arrays crudos, usar
std::vector,std::array,std::map. - Algoritmos: En lugar de bucles manuales, usar
std::find,std::sort,std::copy. - Cadenas:
std::stringen lugar dechar*. - Flujos:
std::ifstream/std::ofstreamen lugar defopende C.
// Malo: búsqueda manualbool found = false;for (int i = 0; i < vec.size(); ++i) { if (vec[i] == target) { found = true; break; }}
// Bueno: algoritmo STLbool found = std::find(vec.begin(), vec.end(), target) != vec.end();Cómo dar retroalimentación: En lugar de «Esto está mal», diga: «¡Excelente lógica! En la STL hay una función ya hecha std::find que hace lo mismo, pero de forma más corta y segura. ¿Probamos a usarla?».
3. Estilo de código, nomenclatura y constancia
La legibilidad del código es la mitad del éxito. Incluso un código que funciona perfectamente es inútil si no se puede mantener.
En qué fijarse:
- Nomenclatura: Variables en
snake_case(según el estándar C++), clases enPascalCase. Evite nombres de una sola letra (exceptoipara contadores). - Constancia: Los parámetros que no cambian deben ser
const. Los métodos que no modifican el objeto deben serconst. - Formato: Un estilo uniforme de sangría (generalmente 4 espacios), espacios alrededor de los operadores.
- Números mágicos: Extráigalos a constantes (
constexpr int MAX_SIZE = 100;).
// Malo: ilegibleint a = 5;for(int i=0;i<10;i