Guía

code smells: guía para desarrolladores

Los code smells son señales de advertencia en tu código que indican problemas más profundos. No son errores y el código seguirá funcionando, pero pueden dificultar el desarrollo futuro y aumentar el riesgo de errores.

Índice

  • Chevron right icon¿Qué es un problema de código?
  • Chevron right icon¿Cuáles son algunos ejemplos de code smells?
  • Chevron right icon¿Por qué son importantes los olores de código?
  • Chevron right icon¿Cómo se pueden abordar los problemas de código?
  • Chevron right iconSonar y los problemas de código

¿Qué es un problema de código?

Los problemas de código se definen como categorías de problemas en el código que pueden dar lugar a problemas más graves con el tiempo. Son similares a los indicadores de advertencia que surgen debido a posibles malas prácticas de codificación.

Aunque los problemas de código no son errores o fallos en sí mismos y no afectan a la funcionalidad del software, indican debilidades en el diseño que pueden ralentizar el desarrollo o aumentar el riesgo de errores o fallos en el futuro.

Algunos ejemplos comunes de code smells son problemas como clases grandes y métodos largos, es decir, una función que intenta hacer demasiado o métodos que son difíciles de entender.

Otro ejemplo es el código duplicado, en el que el mismo fragmento de código se repite en varios lugares.

Problemas como estos pueden dar lugar a un código torpe, aumentar la complejidad cognitiva del código base y contribuir a problemas de mantenimiento y a un aumento de la deuda técnica en el software.

¿Cuáles son algunos ejemplos de code smells?

El siguiente código en Python tiene una puntuación de complejidad cognitiva de 8 debido a la forma en que están anidadas las funciones. Aunque este código funciona correctamente, añade una complejidad innecesaria al escritor, al revisor y al futuro desarrollador si no se corrige.

def process_user(user):

    if user.is_active():             # +1 (if)

        if user.has_profile():       # +1 (if) +1 (nested)

            ... # process active user with profile

        else:                        # +1 (else)

            ... # process active user without profile

    else:                            # +1 (else)

        if user.has_profile():       # +1 (if) +1 (nested)

            ... # process inactive user with profile

        else:                        # +1 (else)

            ... # process inactive user without profile

¿Por qué son importantes los olores de código?

Los olores de código son indicadores cruciales del estado del software, ya que son señales de alerta tempranas de posibles problemas que podrían surgir en el código base. Son importantes porque pueden identificar lugares en los que el código puede ser vulnerable a problemas en el futuro, aunque ahora funcione correctamente.

Los desarrolladores pueden prevenir fallos fundamentales de diseño, problemas de mantenibilidad y problemas de escalabilidad antes de que se conviertan en problemas más graves detectando los code smells.

La detección de code smells puede parecer intrusiva y molesta en el momento del desarrollo, pero anima a los desarrolladores a seguir las normas de codificación recomendadas y las mejores prácticas, lo que ayuda a crear una cultura de código de alta calidad dentro de los equipos de desarrollo.

Sirven como conceptos orientativos para los desarrolladores que trabajan en proyectos de refactorización, indicándoles la dirección hacia un código más limpio, modular y fácil de mantener.

Además, los olores de código son herramientas didácticas que ayudan a los desarrolladores a comprender mejor los patrones e ideas de diseño de software.

Los desarrolladores pueden perfeccionar sus habilidades, desarrollar una conciencia y apreciación de la calidad del código, y contribuir a la mejora continua de la base de código mediante la identificación y corrección de los olores de código.

Al proporcionar a los desarrolladores un lenguaje común para discutir y gestionar los problemas de calidad del código, los olores de código promueven la cooperación y la comunicación.

Mediante la detección y corrección sistemáticas de los olores de código, los proyectos de software pueden reducir la deuda técnica, aumentar la facilidad de mantenimiento a largo plazo y mejorar la calidad general del software.

¿Cómo se pueden abordar los problemas de código?

La corrección de los problemas de código requiere un plan sistemático que se centre en encontrar el origen del problema y utilizar las técnicas de refactorización adecuadas para solucionarlo. Los desarrolladores deben priorizar primero los problemas de código en función del efecto que tienen en el código base y las posibles ventajas de corregirlos.

El fragmento de código anterior contribuía a los problemas de código porque era innecesariamente complejo y contenía demasiadas líneas de código.

Los problemas que pueden contribuir a la complejidad cognitiva o, en pocas palabras, a la «sobrecarga cerebral», pueden hacer que los desarrolladores dediquen más tiempo a leer y comprender el código que a escribirlo.

Una alta complejidad cognitiva ralentiza los cambios y aumenta el coste de mantenimiento.

La refactorización del código en funciones más pequeñas permite que la complejidad se distribuya entre varias funciones y que las interrupciones en el flujo ya no estén anidadas.

def process_user(user):

    if user.is_active():             # +1 (if)

        process_active_user(user)

    else:                            # +1 (else)

        process_inactive_user(user)

def process_active_user(user):

    if user.has_profile():           # +1 (if) +1 (nested)

        ... # process active user with profile

    else:                            # +1 (else)

        ... # process active user without profile

def process_inactive_user(user):

    if user.has_profile():           # +1 (if) +1 (nested)

        ... # process inactive user with profile

    else:                            # +1 (else)

        ... # process inactive user without profile

Otro ejemplo de código maloliente común es cuando se utiliza una función integrada como nombre de una variable. Aunque es posible que un desarrollador senior no se encuentre con esto, no es una buena práctica de codificación, ya que la función integrada no será accesible a través de su nombre original si se utiliza de esta manera.

 def a_function():

    int = 42


La forma correcta de solucionar esto es utilizar una variable adecuada:


def a_function():

    value = 42

Otro ejemplo de lo anterior son los archivos que tienen demasiadas líneas de código.

Cuando un archivo fuente crece demasiado, puede acumular numerosas responsabilidades y resultar difícil de entender y mantener.

Para que el código sea más fácil de mantener, los archivos que superen un umbral específico deben refactorizarse en archivos más pequeños cuyo código se centre en tareas bien definidas.

Esos archivos más pequeños serán más fáciles de entender y probar.

Hay miles de problemas de este tipo que pueden dar lugar a olores de código, y abordarlos pronto fomenta las buenas prácticas de codificación.

Tan pronto como se localizan los problemas de código, los desarrolladores pueden utilizar diversas estrategias de refactorización para eliminarlos sin cambiar el comportamiento externo del código.

Los desarrolladores pueden dividir los procedimientos largos y complicados que dan lugar a problemas de código en métodos más pequeños y fáciles de gestionar, cada uno de los cuales se encarga de una tarea específica.

Code smells y refactorización

La refactorización, que es el proceso de reestructurar el código sin cambiar su comportamiento externo, se utiliza normalmente para abordar los code smells con el objetivo de mejorar la legibilidad, la modularidad y la calidad general del código.

El proceso de refactorización incluye un análisis riguroso de las ventajas y desventajas, ya que implementar cambios de forma precipitada puede dar lugar a efectos inesperados o a nuevos problemas.

Por lo tanto, eliminar los olores de código requiere una estrategia bien equilibrada que incorpore los conocimientos técnicos con la comprensión de los objetivos y las limitaciones del proyecto.

Al final, los equipos de software pueden promover una cultura de mejora continua detectando y corrigiendo de forma proactiva los olores de código, garantizando que su base de código

sea mantenible, fiable y segura ante cambios a largo plazo.

La refactorización debe ir acompañada de pruebas exhaustivas para garantizar que no se introduzcan defectos ni regresiones.

Con el fin de preservar la legibilidad de la base de código y facilitar los futuros esfuerzos de mantenimiento, los desarrolladores también deben incluir en su documentación la justificación de cada paso de la refactorización.

El intercambio de conocimientos entre el equipo y la validación de las decisiones de refactorización pueden facilitarse mediante revisiones de código y programación en pareja.

Sonar y los problemas de código

SonarQube Server y SonarQube Cloud pueden ayudar a los desarrolladores a identificar y prevenir problemas de código, junto con otros problemas (errores y vulnerabilidades de seguridad, etc.).

Ambos se integran de forma nativa en sus canalizaciones de CI/CD para encontrar y solucionar problemas en una fase temprana del desarrollo, antes de que creen dificultades en la producción.

SonarQube for IDE, una herramienta complementaria de SonarQube Server y SonarQube Cloud, es un complemento IDE que proporciona información en tiempo real dentro del editor del desarrollador, resaltando los problemas del código (incluidos los olores de código) a medida que los desarrolladores escriben el código.

  • Follow SonarSource on Twitter
  • Follow SonarSource on Linkedin
language switcher
Español (Spanish)
  • Documentación jurídica
  • Centro de confianza

© 2008-2024 SonarSource SA. Todos los derechos reservados. SONAR, SONARSOURCE, SONARQUBE, y CLEAN AS YOU CODE son marcas comerciales de SonarSource SA.