Introducción a la programación
En este curso aprenderemos los fundamentos a la programación estructurada. Estudiaremos el ciclo de desarrollo de una aplicación: análisis,...
Lo que se conoce como código espagueti puede generar problemas en el desarrollo de software a largo plazo. Te contamos algunas técnicas para evitarlo.
¿Alguna vez te has encontrado con un código difícil de entender, lleno de redundancias y enredado como un plato de espagueti? Si es así, no estás solo. El código espagueti es un término que se utiliza para describir un código mal estructurado y difícil de mantener, lo que puede causar problemas en el desarrollo de software a largo plazo.
¿Cómo evitarlo? En este artículo, descubrirás las técnicas para mejorar tu código aplicando los fundamentos del Clean Code.
El código espagueti es un término que se utiliza para definir aquellos programas o proyectos informáticos que tienen una estructura de control de flujo compleja, sin una estructura definida. Si vemos este código de una forma global, o mediante un diagrama de clases, se parece mucho a un plato de espagueti, como si fuera un montón de hilos enredados, lo que hace difícil su interpretación y mantenimiento.
En realidad, se trata de un estilo de programación antiguo, que se remonta a los años 60 en lenguajes, donde el flujo se controla mediante sentencias de control muy primitivas como GOTO y números lineales. Aunque el GOTO se ha ido eliminando de la mayor parte de los lenguajes, todavía aparece en programas antiguos, que contienen el llamado código Legacy.
Esta instrucción se considera una mala práctica, y por ejemplo para el lenguaje PHP está disponible en versiones inferiores a la 5.3, en las versiones más modernas ya está eliminado al considerar una mala praxis de programación.
A continuación, puedes ver un ejemplo práctico, muy sencillo, del funcionamiento de esta estructura de control:
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j alcanzó 17';
?>
El resultado es j alcanzó 17
El uso de esta instrucción complica el flujo del código, pues en lugar de tener un flujo secuencial, este puede ir dando saltos y, si abusamos, del mismo puede complicar bastante la estructura de nuestro programa, llegando a convertirse en un código tipo espagueti.
Como se puede imaginar el uso de esta estructura condicional complica la legibilidad e interpretación del programa, dando saltos a diferentes funciones y enredando todo el código como si de un plato de espagueti se tratara.
Además, debemos comprender que no todo el código espagueti se produce por la estructura de control GoTo, un mal estilo de codificación el que no se mantiene una secuencia de flujo definida, o en el que las funciones o métodos no tienen una nomenclatura clara, pueden provocar el mismo efecto dando como resultado una enorme dificultad para comprender el código.
Una solución al código espagueti es la refactorización, pero a medida que un programa crece en funcionalidades y por ende el tamaño, el trabajo se hace más complejo y llegará un momento que esta tarea se haga imposible.
En este sentido, los Frameworks más populares, están diseñados bajo distintos paradigmas de programación, tales como el Modelo MVC, Modelo-vista-Controlador, permiten disponer de una estructura de carpeta, separando el código en diversas carpetas con archivos de configuración, de funciones, separando la lógica de la parte visual.
Este es un gran paso para eliminar los códigos espagueti, sin embargo, existen profesionales que por falta de tiempo o desconocimiento siguen tomando atajos para ir más rápido o mezclando fragmentos de código en archivos donde no corresponde.
Un ejemplo gráfico de este problema es la concatenación de sentencias condicionales tipo if-else, en un bucle for, esto puede resolverse fácilmente o bien utilizando una sentencia switch o bien filtrando el objeto o array antes de iterar, de hecho, en algunos Framework como Vue js, aunque está permitido, se considera una mala práctica utilizar un bucle for con una sentencia condicional if, ya que hay soluciones más efectivas para iterar un determinado objeto.
Aunque ya hemos contemplado algunas medidas para evitar el código espagueti, en este apartado entraremos en más profundidad en acciones que permitan escribir un código más legible, evitando la formación de código mal estructurado.
Indentación del código: aunque es algo básico, algunos programadores se olvidan de indentar su código, y es una técnica que permite mover bloques de código a la derecha para separarlos del margen izquierdo y distinguirlo mejor del código adyacente, permitiendo diferencias mediante diversas profundidades, zonas del código. En lenguajes como Python, si el código no está correctamente indentado no funciona, dando un error en el tiempo de ejecución.
Comentarios en el código: es otro elemento importante para muchos desarrolladores, y suelen ser muy útiles para poder analizar el código a posteriori. Los lenguajes de programación tratan de ofrecer todo tipo de ayudas para hacer que la programación lleve menos tiempo y producir un código más claro de estudiar y analizar, y el uso de comentarios es imprescindible.
KISS (Keep Is Simple Stupid): refactorizar las funciones complejas en funciones más simples es fundamental para mejorar la legibilidad y mantenibilidad de un programa. De esta forma nos aseguraremos de que si un compañero entra a editar nuestro código pueda comprender qué acción realiza cada función, mejorando el tiempo de solución de incidencias notablemente.
GitHub: un sistema de control de versiones es fundamental documentar los cambios que se hagan en el programa, pero además hay que utilizarlo de forma correcta. Hay que prestar mucha atención en el texto que describe a los commits, dividir el trabajo en ramas, para que un período de tiempo se pueda recorrer el historial de commits y revisar los fragmentos de código que se han ido modificando y su porqué. Para esto no vale que un commit integre el cambio o adición de varios cientos de líneas en diferentes archivos, lo mejor es integrar cambios en la rama a medida que se vayan consiguiendo ítems, corrigiendo bugs, …
Para mejorar tu estilo a la hora de escribir código debemos aplicar todos los aspectos anteriores, pero si concretamos un poco más, tenemos que tener en cuenta estos consejos:
“Divide y vencerás” resuelve primero el problema, crea el algoritmo y luego dividirlo en fragmentos más pequeños, que conformen una serie de funciones concretas.
Los nombres de tus clases, funciones y variables deben ser autodescriptivos, por ejemplo, si definimos una variable de tipo Booleano es mejor denominarlo como isLogued, isAdmin. De esta forma en un simple golpe de vista podemos entender perfectamente a que se refiere esa variable.
Reescribe tu código siempre que puedas, descubre tus propios fallos y mejora continuamente tu código, de esta forma poco a poco aprenderás de tus errores y lograrás mejorar tu estilo de programación.
Mantén actualizadas las dependencias de tus proyectos, esto es fundamental, para evitar errores de dependencias externas, un fallo muy común es no anclar las versiones de nuestros proyectos, utilizando dependencias con la versión @latest, que al no estar controladas pueden provocar graves fallos en nuestra aplicación si hemos incluido a esta dependencia mediante un servicio CDN.
Componentes (Web Components): las últimas tendencias de la programación, han estructurado la información en unidades de código, de forma que componen un árbol de funcionalidades que permiten hacer el código más legible y manteniendo el principio de divide y vencerás, lo que permite un rápido testeo de nuestra aplicación y crecimiento de la estructura de la misma.
Como puedes comprobar son aspectos muy básicos, bastante lógicos que a modo de novela narran una serie de instrucciones para que nuestro programa realice una serie de acciones, por eso es imprescindible los comentarios y una adecuada documentación, ya que cuanto más claro este y más detallada, mejor definiremos a nuestra aplicación.
Clean Code, o Código Limpio, consiste en una metodología de desarrollo de software, que contiene una serie de principios que ayudan a producir código intuitivo y fácil de modificar, con técnicas simples que facilitan la escritura y lectura de un código, volviéndolo más fácil de entender. Se trata por tanto de la antítesis del código espagueti, y la aplicación de estos aspectos nos hace mejores programadores.
Aunque hay diversas metodologías relacionadas con buenas prácticas a la hora de la escritura de código, en este apartado te damos las claves de Clean Code, aunque existen otras muy conocidas como son SOLID.
Podemos resumir a la metodología Clean Code mediante esta serie de reglas:
Los nombres son importantes: la definición de variables, funciones o parámetros son esenciales para entender el código, al definir un nombre debemos tener en cuenta que debe ser preciso, que entregue la idea de lo que hace, sin preocuparnos por la longitud del campo. Por ejemplo, podemos definir una función que compruebe si un usuario está logueado como isUserLoggedInPrublicArea(). Lo que nos da la idea general del cometido de esa función.
Regla del boy scout: Existe un principio que afirma que, si sales de una zona de acampada, debes dejarla más limpia que cuando la encontraste. En el mundo de la programación, la podemos interpretar como dejar el código más limpio, mejor refactorizado de lo que estaba antes de editarlo. De esta forma, siempre se garantiza la refactorización y la mejora del código por los distintos miembros de un equipo.
Debes ser el verdadero autor del código: Aunque puedes copiar código y replicarlo es importante que lo entiendas y apliques tus aportes, para comprenderlo en el futuro. Los programadores deben preocuparse por el modo en el que el código esté presentado, siempre aplicando el precepto de que las funciones deben ser pequeñas, no importa cuánto. El problema general de un código sucio deriva en gran parte de funciones enormes, que realizan muchas funciones y que en ocasiones son difíciles de entender. Así que es mejor, tener 10 funciones específicas, en la que se haga cada vez una cuestión que una única que supere las 50 líneas de código, porque si a este le aplicamos una nomenclatura clara, por ejemplo, is Boolean, IsPositive, isNotNUll, interpretamos de una forma sencillo que hace cada una de ellas y podemos ser más rápidos a la hora de actualizar y refactorizar el código.
DRY (Don’t Repeat Yourself): El principio DRY defiende que cada parte del conocimiento de un sistema debe tener representación única y ser totalmente libre de ambigüedades. En otras palabras, define que no pueden existir dos partes del programa que realicen la misma función, de esa forma se elimina la existencia de código redundante que pueda provocar dificultad a la hora de mantener el código. Si ves que un fragmento se repite varias veces, es el momento de buscar una opción para refactorizar y quizás definir una nueva función.
Comentar solamente lo necesario: Aunque lo comentarios son necesarios y eficaces, también de debe tener en cuenta que son los grandes olvidados de la refactorización, normalmente se modifica el código y se olvida cambiar los comentarios asociados, es por ello, que abusar de los mismos también puede considerarse como una mala praxis en programación.
Tratamiento de errores: A veces, se producen fallos a la hora de ejecutar nuestro programa, estos fallos en ocasiones son inevitables, pero no es correcto que el programa completo se quede bloqueado. Es por ello, que, tratar las excepciones de forma correcta es un gran paso para el programador en desarrollo. De forma que se controle el fallo y no provoque el colapso total de nuestra aplicación. Además, de esta forma podemos generar un log interno que nos ayude a la hora de debuguear el citado error.
Tests limpios: Los test, forman parte del código y deben aplicarse los mismos preceptos en cuanto a ordenación, documentación y organización del código se refiere. De forma, que se mantengan los aspectos de mantenimiento y reusabilidad del código.
Imagina, por un momento, que entras en una empresa a desarrollar tu labor como programador y te pasan un código tipo “legacy”, en el que no entiendes nada, los nombres de las funciones y variables no están bien definidas, el código es engorroso, no hay comentarios…, en resumidas cuentas, tardas mucho en comprender que hace el código y eso se traduce en tiempo y dinero perdido, posiblemente estés antes un código de tipo espagueti.
Actualmente existen suficientes herramientas y recursos como para codificar un código limpio, ordenado y no tiene sentido crear un código tipo espagueti. Para evitar esta mala práctica, es fundamental aplicar principios como Solid o Clean Code, generar documentación, disponer comentarios son algunos ejemplos básicos para que mejore tu estilo de codificación.
En OpenWebinars dispones de los siguientes cursos relacionados con las buenas prácticas en la codificación:
Si realizas estos cursos, seguro que te ayudan a mejorar tu estilo de programación, mejorando tus habilidades y evitando que a lo largo de tu carrera profesional realices código espagueti.
En mi opinión, la creación de este tipo de código es más por descuido, falta de tiempo, etc., que, por un déficit de conocimientos, como has visto los principios Clean Code son de una lógica aplastante y muy fáciles de aplicar. Además, si utilizas un Framework, estos ya se encargan de gestionar los diferentes tipos de ficheros, definir la lógica y funcionalidad de la app y es muy difícil y desaconsejable modificar esta estructura, ya que puede conllevar a la creación de un código que no se legible.
También te puede interesar
En este curso aprenderemos los fundamentos a la programación estructurada. Estudiaremos el ciclo de desarrollo de una aplicación: análisis,...