Qué ejemplos de mal código debo mostrar en mis talleres

La calidad del código es fundamental en cualquier proyecto de desarrollo de software. Un código limpio no solo es más fácil de leer y entender, sino que también reduce los errores, facilita el mantenimiento y, en última instancia, ahorra tiempo y dinero. Organizar talleres de escritura de código limpio es una excelente manera de impartir este conocimiento, pero para que sean realmente efectivos, es esencial demostrar a los asistentes ejemplos concretos de lo que no debe hacerse. Estos ejemplos sirven como puntos de referencia, permitiendo a los participantes visualizar directamente las consecuencias de prácticas poco saludables y motivándolos a adoptar soluciones más eficientes. Sin un buen conjunto de ejemplos de "mal código", el taller corre el riesgo de ser teórico y poco práctico.
Un buen taller de código limpio debe ir más allá de la simple definición de las reglas. Debe involucrar una experiencia práctica, donde los participantes puedan analizar y corregir ejemplos problemáticos. La demostración de casos reales, desde errores conceptuales hasta problemas de estilo, es crucial para que el aprendizaje sea significativo y duradero. El objetivo final es que los asistentes no solo conozcan qué hacer, sino cómo hacerlo y por qué es importante. Por lo tanto, elegir cuidadosamente los ejemplos que se van a mostrar es una decisión vital para el éxito del taller.
Errores de Legibilidad
La legibilidad es la piedra angular del código limpio. Un código difícil de leer es un código propenso a errores, difícil de mantener y que genera frustración en los desarrolladores. Un ejemplo clásico de código ilegible es el que utiliza nombres de variables y funciones poco descriptivos. En lugar de “x” o “foo”, se deben emplear nombres que reflejen el propósito de la variable o función, como "clienteNombre" o "calcularTotalVentas". Esto permite a los lectores comprender rápidamente el significado del código sin necesidad de invertir tiempo en adivinanzas.
Otro aspecto crítico de la legibilidad es la longitud excesiva de las líneas y los métodos. Un método que supera las 30 líneas de código es, casi con seguridad, difícil de comprender de un vistazo. Es crucial dividir estas funciones en unidades más pequeñas y enfocadas, cada una con una única responsabilidad. Además, la falta de comentarios adecuados, especialmente en áreas complejas o poco evidentes, dificulta enormemente la comprensión del código. Los comentarios deben explicar por qué se hizo algo, no qué se hizo, ya que el código en sí mismo debe ser autoexplicativo.
Finalmente, la falta de indentación y el uso inconsistente del estilo de código contribuyen a la ilegibilidad. Un código sin indentación es como un edificio sin planta, donde las diferentes partes no tienen una relación clara entre sí. La consistencia en el estilo, incluyendo la indentación, los espacios en blanco y la sintaxis, es fundamental para facilitar la lectura y comprensión del código.
Código Duplicado
El duplicado es un pecado común que agrava la complejidad y dificulta el mantenimiento del código. Cuando se repite el mismo código en diferentes lugares, cualquier cambio que deba hacerse en ese código debe ser realizado en múltiples lugares, lo que aumenta el riesgo de introducir errores y dificulta la consistencia. La refactorización para eliminar el código duplicado es una práctica esencial en el desarrollo de código limpio.
La posibilidad de errores aumenta significativamente al tener código duplicado. Si se necesita modificar una lógica específica, y está duplicada en varios lugares, es posible que no se modifique en todos los casos, lo que lleva a un desajuste y a problemas en el futuro. También dificulta la actualización de la documentación, ya que es necesario actualizarla en cada instancia de código duplicado. En lugar de duplicar el código, se debe utilizar funciones, clases o patrones de diseño para encapsular la lógica común y reutilizarla de manera eficiente.
Una técnica útil para identificar el código duplicado es la herramienta de análisis estático. Estas herramientas analizan el código en busca de patrones repetitivos y sugieren posibles refactorizaciones. Adoptar un enfoque de "reutilizar, no reimplementar" es un principio fundamental de la escritura de código limpio.
Dependencias Accesorias
Las dependencias son otros componentes de software que un proyecto necesita para funcionar. Si bien las dependencias son esenciales, el uso excesivo o inapropiado puede generar problemas como código difícil de probar, problemas de compatibilidad y una gran complejidad general. Un ejemplo de esto es el uso de bibliotecas con funcionalidades que podrían implementarse internamente.
Un problema común es la dependencia de bibliotecas con una gran cantidad de funcionalidades que no se utilizan realmente. Esto agrega complejidad innecesaria al proyecto y hace que sea más difícil de mantener. Además, cada vez que se actualiza la biblioteca, existe la posibilidad de que se introduzcan breaking changes que afecten al proyecto. En lugar de depender de bibliotecas con funcionalidades innecesarias, se deben elegir bibliotecas que sean pequeñas, enfocadas y bien mantenidas.
Es crucial mantener el control sobre las dependencias y evitar la dependencia de bibliotecas de terceros que no son de confianza. Analizar cuidadosamente las dependencias antes de agregarlas a un proyecto y utilizar herramientas de gestión de dependencias para facilitar su administración es fundamental.
Contexto de la Función

Un problema común en el código limpio es las funciones que hacen demasiadas cosas. Estas funciones, a menudo llamadas "camiones de carga", son difíciles de comprender, probar y mantener. Un ejemplo claro es una función que tanto valida datos como calcula impuestos y genera informes. Esta función tiene un contexto demasiado amplio y debe ser dividida en funciones más pequeñas y enfocadas.
Una función debe tener una única responsabilidad: hacer una sola cosa y hacerlo bien. Si una función hace demasiadas cosas, es probable que no la entienda nadie y que sea difícil de modificar sin introducir errores. La aplicación del principio de responsabilidad única (SRP) es una herramienta valiosa para identificar funciones que necesitan ser divididas. Además, se deben utilizar nombres de funciones que reflejen su propósito específico.
El contexto de la función debe ser lo más pequeño posible, lo que facilita la comprensión, la prueba y la reutilización del código. Considerar las consecuencias de la complejidad de una función en la legibilidad y el mantenimiento es fundamental para escribir código limpio.
Código Difícil de Probar
El testeo es una parte integral del desarrollo de software. El código que es difícil de probar es código que es propenso a errores y que es difícil de mantener. Un ejemplo de código difícil de probar es el que utiliza excepciones no controladas para manejar errores. Si una excepción no es controlada, es difícil saber si se ha producido un error y cómo recuperarse de él.
El código que utiliza excepciones no controladas dificulta la escritura de pruebas unitarias. Las pruebas unitarias deben probar cada componente del sistema de forma aislada. Si una excepción no es controlada, la prueba unitaria no puede verificar si se ha producido una excepción. Un enfoque mejor es utilizar códigos de error, que son valores numéricos o cadenas de texto que indican el tipo de error que se ha producido. Los códigos de error se pueden utilizar para realizar un seguimiento de los errores y para tomar decisiones basadas en ellos.
Es crucial escribir código que sea fácil de probar, lo que implica diseñar el código de forma que se pueda dividir en componentes más pequeños y que se puedan probar de forma aislada. Utilizar técnicas de diseño como la inyección de dependencias y el diseño orientado a interfaces facilita la escritura de pruebas unitarias.
Conclusión
Presentar ejemplos de mal código no es simplemente mostrar errores, sino proporcionar un punto de partida para la reflexión y la mejora. Al exponer directamente los patrones que conducen a la ilegibilidad, la duplicación, las dependencias excesivas y el código difícil de probar, los talleres pueden impulsar a los participantes a adoptar prácticas más disciplinadas y a escribir código de mayor calidad.
La clave para un taller exitoso radica en la combinación de la presentación de ejemplos problemáticos con la práctica y el feedback. No basta con mostrar un código feo; es necesario que los asistentes lo modifiquen, exploren diferentes soluciones y vean el impacto de sus cambios. Al final del taller, los participantes deberían ser capaces de reconocer los patrones de código "malo" y aplicar las técnicas de escritura de código limpio de forma consciente y proactiva, elevando la calidad de su trabajo y contribuyendo a proyectos más robustos y mantenibles.
Deja una respuesta