está bien encapsulado. No se filtra al resto del sistema. Compáralo con este componente de botón. Se podría argumentar que no hace mucho en comparación con la complejidad de su interfaz. Más importante aún, podemos ver que está mezclando varias preocupaciones aquí. Tenemos las preocupaciones del propio botón, pero también tenemos las preocupaciones del icono y la información sobre herramientas. Así que no solo la implementación de este componente es probablemente muy compleja, sino que también está propagando esa complejidad por el resto de la base de código.
Es importante saber que nadie se propone construir algo muy complejo desde el principio. Las cosas suelen empezar de manera simple, como nuestra implementación inicial de la tarjeta de ubicación. Este era un componente potente con una interfaz simple. Era un módulo profundo, hasta que dejó de serlo. Así que es importante que controlemos esta evolución para asegurarnos de que las abstracciones que implementamos al principio siguen siendo las soluciones correctas a los problemas que tenemos hoy.
Y esto me lleva a mi técnica final para gestionar la complejidad, que es enfocar tus esfuerzos en reducir la carga cognitiva. Con esto, me refiero a minimizar la cantidad de información que necesitas mantener en tu cabeza para hacer un cambio simple. Toma este componente, por ejemplo. Es una cuadrícula de enlaces a diferentes partes de la aplicación que los usuarios verán en sus paneles de control, pero diferentes usuarios verán diferentes enlaces dependiendo de qué tipo de usuario sean y también de qué plan tengan. Por ejemplo, un usuario regular en el plan básico solo verá estos cuatro enlaces. Ahora imagina que queremos hacer un cambio, como añadir un nuevo enlace a este grupo particular de usuarios. Así es como se ve la implementación. Es bastante limpia, y veo que tengo una lista de enlaces allí, así que sé que ahí es donde necesito ir y añadir mi nuevo enlace. Veo que estamos filtrando los enlaces en función del usuario y del plan, lo cual es genial porque eso es exactamente lo que necesito hacer, y luego simplemente estamos renderizando los enlaces.
Ahora esta función de filtrar enlaces parece importante. Sé que necesito entrar allí y cambiar la lógica de alguna manera para que muestre mi nuevo enlace a los conjuntos correctos de usuarios, y cuando abro esta función podríamos encontrar algo que se vea así. Ahora esta es una implementación particularmente desordenada, así que no te fijes demasiado en ella. El punto importante aquí es que ahora necesito entender completamente esta lógica de filtrado para hacer mi pequeño cambio simple. Así que necesito cargar toda esta información en mi cabeza para hacer el cambio. Ahora imagina si el componente de cuadrícula se ve algo así en su lugar. Es muy similar y todavía tengo una lista de enlaces, pero ahora ves que puedo declarar qué usuarios y plantas tienen acceso al enlace directamente en la lista. Así que todo lo que necesito hacer es añadir un nuevo elemento aquí y puedo seguir con mi día. Observa que todavía estamos llamando a la función de filtrar enlaces y por todo lo que me importa esa función puede ser muy muy compleja, pero ahora yo ni siquiera necesito abrir esta función para hacer ese cambio. Me ahorro tener que cargar toda esa lógica en mi cabeza. Este es solo un ejemplo de cómo podemos reducir la carga cognitiva en nuestra aplicación. Otras cosas que podemos hacer incluyen el uso de nombres de variables claros para que no tengamos que adivinar qué hace un componente o una variable, escribir buenos comentarios que no repitan el código sino que expliquen el por qué y el cómo, usar patrones de diseño predefinidos design patterns porque ya tenemos un entendimiento compartido de cómo funcionan, y documentar decisiones importantes en algún lugar, particularmente esas decisiones de alto nivel que simplemente no pertenecen a un comentario de código. El mensaje central de esta charla es que la simplicidad es muy difícil. Hacer las cosas fáciles de cambiar y fáciles de entender es definitivamente posible pero no es fácil en absoluto. La complejidad es un enemigo imposible. Nunca podemos eliminarla completamente pero sí tenemos cierto nivel de control sobre su crecimiento y espero que puedas usar algunas de las estrategias que cubrimos hoy para ralentizarla antes de que se apodere de tu base de código. Si disfrutas hablando sobre la complejidad, el diseño de software y la arquitectura puedes encontrarme en línea como charca en todas las redes sociales y también en mi sitio web frontend.skl donde escribo sobre diseño de software y arquitectura para desarrolladores de frontend. Muchas gracias por tenerme y espero que disfrutes el resto de la masterclass.
Comments