Introducción: por qué el code review en Rust no es solo una formalidad
\n\nEl code review es uno de los procesos clave en el desarrollo de cualquier software de calidad. Pero cuando se trata de Rust, este proceso adquiere una importancia especial. Rust es un lenguaje con un sistema único de propiedad (ownership) y préstamo (borrowing) que el compilador verifica en tiempo de compilación. Sin embargo, incluso si el código compila, eso no significa que esté bien escrito, sea seguro y eficiente.
\n\nEn este artículo, analizaremos exactamente en qué aspectos prestar atención durante el code review de proyectos en Rust, cómo dar retroalimentación constructiva para no ofender a un colega y cómo evitar errores típicos que el compilador no detecta. El artículo está dirigido a desarrolladores que ya conocen los fundamentos de Rust, pero desean profundizar sus habilidades de revisión.
\n\n1. Seguridad de memoria y gestión de recursos
\n\nRust garantiza la seguridad de la memoria sin un recolector de basura. Pero esto no elimina la necesidad de verificar cómo el desarrollador utiliza bloques unsafe, punteros sin procesar y llamadas FFI externas.
Qué verificar:
\n- \n
- Uso de
unsafe: cada bloqueunsafedebe estar justificado y acompañado de un comentario que explique por qué es seguro. Si se puede prescindir deunsafe, es mejor hacerlo. \n - Fugas de recursos: verifique que todos los
Box,Rc,Arcy otros punteros inteligentes se liberen correctamente. Por ejemplo, las referencias cíclicas a través deRcsinWeakson un problema común. \n - Orden de Drop: si la estructura contiene campos con una implementación personalizada de
Drop, asegúrese de que el orden de destrucción no provoque errores. \n
// Ejemplo de mal código: unsafe sin comentarios\nunsafe {\n let ptr = ...;\n // No hay explicación de por qué esto es seguro\n *ptr = 42;\n}\n\n// Buen código: comentario y alternativa segura\n// Usamos unsafe solo para llamar a una función C que garantiza la validez del puntero\nunsafe {\n // El puntero se obtuvo de la API de C, que garantiza su validez durante la vida de la llamada\n some_c_function(ptr);\n}\n\n\n2. Modismos del código y estilo
\n\nRust tiene sus propios modismos, que difieren de C++ o Python. El code review debe verificar qué tan bien el código se ajusta al espíritu del lenguaje.
\n\nQué verificar:
\n- \n
- Uso de
OptionyResult: eviteunwrap()yexpect()sin una razón explícita. En código de producción, use el manejo de errores mediantematch, el operador?ounwrap_or_else. \n - Pattern matching: prefiera
if letymatchen lugar de cadenas deis_some()/is_ok(). \n - Uso de traits: verifique que los traits se implementen de manera significativa. Por ejemplo, la implementación de
Displaydebe proporcionar una salida legible, no soloDebug. \n - Nomenclatura: en Rust se acostumbra usar
snake_casepara variables y funciones,CamelCasepara tipos y traits. Las constantes —SCREAMING_SNAKE_CASE. \n
// Mal: uso excesivo de unwrap\nlet value = some_option.unwrap();\n\n// Bien: manejo de errores\nlet value = match some_option {\n Some(v) => v,\n None => return Err("Value not found".into()),\n};\n\n// Aún mejor: con el operador ?\nlet value = some_option.ok_or("Value not found")?;\n\n\n3. Rendimiento y asignaciones
\n\nRust proporciona control de bajo nivel sobre la memoria, pero esto no significa que el código sea automáticamente rápido. En la revisión es importante verificar posibles cuellos de botella.
\n\nQué verificar:
\n- \n
- Asignaciones innecesarias: verifique si no se está creando un
StringoVec