Introducción: Por qué se necesita la revisión de código en C++
La revisión de código es una de las prácticas clave del desarrollo profesional. En el mundo de C++, donde los errores de gestión de memoria o el uso incorrecto de STL pueden provocar errores difíciles de encontrar y fugas, una revisión de alta calidad se vuelve críticamente importante. Esto no es solo una verificación de estilo, sino una búsqueda sistemática de problemas potenciales: desde errores lógicos hasta violaciones de RAII (Resource Acquisition Is Initialization).
En este artículo, veremos a qué prestar atención durante la revisión de código de C++, cómo formular comentarios para que sean útiles en lugar de ofensivos, y cómo introducir una cultura de revisión saludable en un equipo.
Qué verificar durante la revisión de código de C++
La revisión no es leer código como un libro. Es un análisis activo. Utilice la siguiente lista de verificación para no pasar por alto cosas importantes.
1. Seguridad de memoria y RAII
C++ no perdona el descuido con los recursos. Verifique:
- Si se usan punteros inteligentes (
std::unique_ptr,std::shared_ptr) en lugar denew/deletesin procesar. - Si hay fugas de memoria si el código usa punteros sin procesar en escenarios complejos.
- Si se sigue el principio RAII: todos los recursos (archivos, sockets, mutex) deben estar envueltos en clases con constructores y destructores correctos.
// Mal: puntero sin procesar, gestión manualvoid process() { int* data = new int[100]; // ... olvidó delete[] — fuga
// Bien: puntero inteligentevoid process() { auto data = std::make_unique<int[]>(100); // la memoria se liberará automáticamente}2. Uso correcto de STL y algoritmos
La biblioteca estándar de C++ es potente, pero es fácil usarla incorrectamente.
- Verifique si se ha escrito un bucle manual donde podría usarse
std::find,std::copy,std::transform. - Preste atención a la invalidación de iteradores (por ejemplo, después de
push_backenstd::vector). - Si se usa
constpara referencias cuando el objeto no se modifica (const std::string&en lugar destd::string).
// Mal: copiar una cadena y búsqueda manualbool hasValue(std::string s, char c) { for (size_t i = 0; i < s.size(); ++i) { if (s[i] == c) return true; } return false;}
// Bien: referencia const y algoritmobool hasValue(const std::string& s, char c) { return std::find(s.begin(), s.end(), c) != s.end();}3. Reglas modernas de C++ (C++11/14/17/20)
Las construcciones obsoletas son una señal de alerta.
- Reemplazar
typedefconusing. - Usar
autopara tipos complejos (pero no en todas partes — la legibilidad es más importante). - Usar
nullptren lugar deNULLo0. - Verificar
constexprynoexceptcuando corresponda.
4. Rendimiento y arquitectura
Incluso el código correcto puede ser lento o difícil de mantener.
- Evitar copias innecesarias: pasar objetos grandes por valor es un error común.
- Verificar si se llama a una función virtual en un bucle intensivo (si no está justificado).
- Evaluar el acoplamiento de clases: ¿el código viola los principios SOLID?
Cómo dar retroalimentación: reglas para una revisión constructiva
La parte técnica es la mitad de la batalla. La otra mitad es el factor humano. Un comentario mal entregado puede desmotivar al autor o causar conflicto.
1. Separar la crítica del código y la personalidad
Hable sobre el código, no sobre el programador. En lugar de "Escribiste un código terrible", diga "En este lugar, es mejor usar un puntero inteligente para evitar una fuga".