El acoplamiento es un concepto importante en el desarrollo de programas informáticos porque limita la capacidad de los programas informáticos para cambiar. El acoplamiento temporal es un tipo de acoplamiento en el que el código depende de alguna manera del tiempo. Es particularmente insidioso porque es difícil de detectar a menos que se sepa lo que se está buscando.
Hay tres formas diferentes de acoplamiento temporal que he encontrado a lo largo del tiempo.
Secuenciación
La primera forma de acoplamiento temporal es cuando hay algún tipo de ordenamiento; una cosa debe suceder antes que otra. El ejemplo habitual de esto es una clase que requiere que los métodos sean invocados en un orden particular, como por ejemplo que se requiera algún tipo de init() para ser llamado antes de poder llamar a act().
Aquí hay un ejemplo simple:
var circle = new Circle();circle.setRadius(10);circle.getCircumference(); // lanza si no has llamado primero a setRadius()!
El ejemplo anterior es artificioso, pero ilustra el punto. Este tipo de código es bastante común, aunque los nombres de las clases y los métodos a veces lo disfrazan.
El principal problema causado por este tipo secuencial de acoplamiento temporal es que los desarrolladores deben conocer el orden requerido para que las cosas se hagan. Si ese orden no está claro o no se aplica de alguna manera, entonces puede terminar con excepciones inesperadas – o peor aún, se transmiten malos datos en sentido descendente. ¿Cómo puede un desarrollador conocer el orden requerido?
En algunos casos, como en el ejemplo del círculo, se puede imponer un orden necesario moviendo los parámetros en el constructor. Entonces el objeto comienza en un estado válido, y como no se puede llamar a un método en el objeto antes de instanciarlo, el desarrollador se ve impedido de hacerlo mal por el tiempo de ejecución del lenguaje o los requisitos del compilador. Esa es una solución común en el mundo orientado a los objetos; alternativamente puedes ir a un estilo más funcional y redefinir getCircumference para tomar un parámetro de radio.o combinar los dos y pasar en un círculo válido a la función, como getCircumfrence(nuevo Circle(10)).
A nivel de diseño de clases, hay varias maneras de solucionar este problema, pero este tipo de acoplamiento también puede ocurrir a través de clases o componentes en la lógica de negocio. ¿Necesitas crear una cuenta antes de poder guardar los datos del usuario en tu base de datos? ¿Hay eventos que deben ocurrir antes que otros? ¿Hay una cadena de eventos en la que un fallo se produce en cascada para que falle todo el proceso? La forma en que diseñas tu sistema afecta a las probabilidades de que los desarrolladores hagan lo correcto.
La clave del acoplamiento temporal de tipo secuencia es hacer las secuencias obvias o eliminarlas completamente.
Esperando
La siguiente forma de acoplamiento temporal es cuando tienes que esperar. Literalmente se acopla a la cantidad de tiempo que se tarda en hacer algo, como una consulta a la base de datos o una llamada a la API RESTful.
Esto ocurre todo el tiempo en el código, y normalmente lo consideramos en términos de cuánto tiempo debe esperar un usuario humano por el software. A los usuarios no les gusta cuando las aplicaciones son lentas (a menudo parecen congelarse) o cuando los sitios web tardan en cargarse. Pero también debemos considerar cuánto tiempo deben esperar las máquinas en otras máquinas, ya que esto afecta al diseño de nuestros sistemas y a la dificultad de programarlos. Incluso si no hay ningún usuario esperando en el otro extremo, ¿puedes entregar un resultado lo suficientemente rápido como para que sea valioso?
El problema de la espera suele agravarse por los problemas de la secuenciación. Un ejemplo típico es que hay que obtener datos de una llamada a la API antes de poder continuar. Si ese servicio de la API debe llamar a otro servicio, entonces hay que esperar al menos la suma de toda la latencia entre llamadas. Cuanto más se deba esperar, mayor será la probabilidad de que se produzca un fallo, ya sea que una máquina se quede sin tiempo o que un humano se dé por vencido. En un sistema distribuido, la recuperación fuera de banda puede ser un patrón útil para combatir tanto la secuenciación como la latencia.
Por desgracia, es difícil eliminar la espera. Las cosas sólo llevan tiempo, pero se puede mitigar la espera consiguiendo máquinas o conexiones de red más rápidas. Se puede aplacar al usuario proporcionando información como un girador, un reloj de arena o una barra de progreso. Si se añaden rutas alternativas, se puede especificar el tiempo que se está dispuesto a esperar antes de proceder con un valor predeterminado o en caché.
La espera también puede reducirse introduciendo asincronicidad.en lugar de esperar a que todo termine antes de entregar cualquier valor, se puede proporcionar progresivamente pequeños bits de valor.lo vemos en las páginas web que primero rinden con datos mínimos, y luego hacen llamadas AJAX para cargar más.los datos incompletos son a menudo «lo suficientemente completos» para muchos propósitos.
Circunstancia
La última forma de acoplamiento temporal que cubriré es la de circunstancia. Wikipedia define el acoplamiento temporal como:
Así que realmente, este tipo de acoplamiento temporal es un subproducto de no notar la falta de cohesión . (¿Qué discusión sobre el acoplamiento estaría completa sin una mención a la cohesión, después de todo?)Se han juntado cosas que están conceptualmente separadas, y esto hace más difícil mantener el código.
Si las dos cosas son obviamente diferentes, entonces este problema es fácil de identificar y corregir. Pero si las dos cosas se sienten relacionadas entonces puede ser más difícil detectar la unión entre las dos. Tal vez los casos más complicados son cuando el acoplamiento se produjo como parte de una optimización del rendimiento, como cuando se hace un bucle sobre un gran conjunto de datos. Normalmente recomiendo aplicar los principios de SOLID y refactorización sana para eliminar esta forma de acoplamiento.
El acoplamiento temporal nacido de las circunstancias puede que nunca se convierta en un problema real. Pero el desconocimiento del mismo conduce a desordenadas bases de código que ralentizan el desarrollo. Entonces, si se convierte en un problema, es un gran problema que requiere mucha reescritura, reestructuración y refactorización.
Aflojar el acoplamiento temporal
Como con todas las formas de acoplamiento, no es realmente posible eliminar completamente el acoplamiento temporal. Si no se controla, puede paralizar su capacidad de cambiar su base de código. Si quiere mantener su acoplamiento temporal bajo, tiene que aprender a reconocer sus formas y aplicar los patrones apropiados para reducirlo.
Categorías: technicalTags: architecture, clean code