Code review en C#: qué revisar y cómo dar retroalimentación
\nEl code review es una de las herramientas más poderosas para mejorar la calidad del código. Para los desarrolladores principiantes de C#, a menudo parece estresante: da miedo que critiquen tu código, o no está claro qué buscar exactamente en el código de otros. En realidad, un buen code review es un diálogo, no un examen. En este artículo, analizaremos en qué fijarse al revisar código C# (especialmente en el ecosistema .NET) y cómo formular observaciones para que ayuden, no ofendan.
\n\n1. Qué revisar en código C#: lista de verificación para el revisor
\nCuando abres un pull request (PR) de un colega, los ojos se te van a todas partes. Para no ahogarte en los detalles, utiliza un enfoque sistemático. Estas son las áreas clave que debes revisar en cualquier proyecto C#.
\n\n1.1. Arquitectura y legibilidad
\nPrimero, evalúa el panorama general. Responde estas preguntas:
\n- \n
- ¿Este código resuelve la tarea planteada? \n
- ¿No duplica la lógica existente (principio DRY)? \n
- ¿Son claros los nombres de clases, métodos y variables? \n
Mal:
\npublic void DoStuff(int a, int b)\n{\n var x = a + b;\n // ... otras 50 líneas\n}\nBien:
\npublic int CalculateTotalPrice(int basePrice, int taxAmount)\n{\n return basePrice + taxAmount;\n}\nEl nombre del método y los parámetros indican inmediatamente su propósito. Esto reduce la carga cognitiva del lector.
\n\n1.2. Manejo de errores y seguridad contra null
\nC# es un lenguaje con un sistema de tipos avanzado, pero NullReferenceException es un problema común. Verifica:
\n- \n
- ¿Se utilizan comprobaciones de
null(?.,??,??=)? \n - ¿Hay manejo de excepciones (try-catch) donde sea necesario? \n
- ¿No se están tragando las excepciones en un catch vacío? \n
Ejemplo de código peligroso:
\nvar user = GetUserById(id);\nConsole.WriteLine(user.Name); // Error si user == null\nVersión segura:
\nvar user = GetUserById(id);\nConsole.WriteLine(user?.Name ?? "Invitado");\n\n1.3. Rendimiento y LINQ
\nLINQ es conveniente, pero puede ser ineficiente. Verifica:
\n- \n
- ¿No se está recorriendo la colección varias veces (por ejemplo,
.Where().Select().ToList()en IQueryable)? \n - ¿Se usa
Any()en lugar deCount() > 0para verificar si hay elementos? \n - ¿No hay materializaciones innecesarias (
.ToList(),.ToArray()) en medio de la cadena? \n
Mal:
\nvar list = items.Where(x => x.IsActive).ToList();\nvar first = list.FirstOrDefault();\nMejor:
\nvar first = items.FirstOrDefault(x => x.IsActive);\n\n1.4. Asincronía y Task
\nEn .NET, la asincronía es el estándar. Revisa:
\n- \n
- ¿Se olvidó el
awaitantes de una llamada asíncrona? \n - ¿Hay llamadas bloqueantes (
.Result,.Wait()) en un contexto síncrono? \n - ¿Se cumple la convención: los métodos asíncronos terminan en
Async? \n
Antipatrón:
\nvar data = GetDataAsync().Result; // Puede causar deadlock\nCorrecto:
\nvar data = await GetDataAsync();\n\n2. Cómo dar retroalimentación: con suavidad pero de forma constructiva
\nIncluso la lista de verificación perfecta es inútil si tus comentarios suenan a crítica. Aquí tienes algunas reglas que ayudarán a que el code review sea útil para todos.
\n\n2.1. Usa mensajes en primera persona y preguntas
\nEn lugar de "Escribiste mal código", di "Me parece que este método se puede simplificar. ¿Qué opinas?".
\nEjemplos de formulaciones:
\n- \n
- "No estoy seguro de entender esta lógica. ¿Podrías explicarla?"