Bajo acoplamiento - Loose coupling

En computación y diseño de sistemas, un sistema débilmente acoplado es uno

  1. en el que los componentes están débilmente asociados (tienen una relación rompible) entre sí y, por lo tanto, los cambios en un componente afectan menos la existencia o el desempeño de otro componente.
  2. en el que cada uno de sus componentes tiene, o hace uso de, poco o ningún conocimiento de las definiciones de otros componentes separados. Las subáreas incluyen el acoplamiento de clases, interfaces, datos y servicios. El acoplamiento flojo es lo opuesto al acoplamiento apretado.

Ventajas y desventajas

Los componentes de un sistema débilmente acoplado se pueden reemplazar con implementaciones alternativas que brinden los mismos servicios. Los componentes de un sistema débilmente acoplado están menos restringidos a la misma plataforma, idioma , sistema operativo o entorno de compilación.

Si los sistemas se desacoplan a tiempo, es difícil proporcionar también integridad transaccional ; se requieren protocolos de coordinación adicionales. La replicación de datos en diferentes sistemas proporciona un acoplamiento flexible (en disponibilidad), pero crea problemas para mantener la coherencia ( sincronización de datos ).

En integración

El acoplamiento flexible en un diseño de sistema distribuido más amplio se logra mediante el uso de transacciones, colas proporcionadas por middleware orientado a mensajes y estándares de interoperabilidad.

Cuatro tipos de autonomía, que promueven un acoplamiento flexible, son: autonomía de referencia , autonomía de tiempo , autonomía de formato y autonomía de plataforma .

El acoplamiento flexible es un principio arquitectónico y un objetivo de diseño en arquitecturas orientadas a servicios ; Once formas de acoplamiento suelto y sus contrapartes de acoplamiento apretado se enumeran en:

  • conexiones físicas a través de mediador,
  • estilo de comunicación asincrónica ,
  • tipos comunes simples solo en el modelo de datos ,
  • sistema de tipo débil,
  • mensajes centrados en datos y autónomos,
  • control distribuido de la lógica del proceso,
  • vinculación dinámica (de consumidores y proveedores de servicios),
  • independencia de la plataforma,
  • compensación a nivel empresarial en lugar de transacciones a nivel del sistema,
  • despliegue en diferentes momentos,
  • actualizaciones implícitas en el control de versiones.

El middleware Enterprise Service Bus (ESB) se inventó para lograr un acoplamiento flexible en múltiples dimensiones; sin embargo, los ESB sobre-diseñados y mal colocados también pueden tener el efecto contrario y crear un acoplamiento estrecho no deseado y un punto de acceso arquitectónico central.

La arquitectura impulsada por eventos también tiene como objetivo promover un acoplamiento flexible.

Métodos para disminuir el acoplamiento

El acoplamiento flexible de interfaces se puede mejorar publicando datos en un formato estándar (como XML o JSON ).

El acoplamiento flexible entre los componentes del programa se puede mejorar mediante el uso de tipos de datos estándar en los parámetros. Pasar tipos de datos u objetos personalizados requiere que ambos componentes tengan conocimiento de la definición de datos personalizados.

El acoplamiento flexible de servicios se puede mejorar reduciendo la información que se pasa a un servicio a los datos clave. Por ejemplo, un servicio que envía una carta es más reutilizable cuando solo se pasa el identificador del cliente y se obtiene la dirección del cliente dentro del servicio. Esto desacopla los servicios porque no es necesario llamar a los servicios en un orden específico (por ejemplo, GetCustomerAddress, SendLetter).

En programación

El acoplamiento se refiere al grado de conocimiento directo que tiene un componente de otro. El acoplamiento flojo en informática se interpreta como encapsulación frente a no encapsulación.

Un ejemplo de acoplamiento estrecho ocurre cuando una clase dependiente contiene un puntero directamente a una clase concreta que proporciona el comportamiento requerido. La dependencia no puede ser sustituida, o su "firma" cambiada, sin requerir un cambio en la clase dependiente. El acoplamiento flojo ocurre cuando la clase dependiente contiene un puntero solo a una interfaz, que luego puede ser implementada por una o muchas clases concretas. La dependencia de la clase dependiente es un "contrato" especificado por la interfaz; una lista definida de métodos y / o propiedades que deben proporcionar las clases de implementación. Cualquier clase que implemente la interfaz puede satisfacer la dependencia de una clase dependiente sin tener que cambiar la clase. Esto permite la extensibilidad en el diseño de software; se puede escribir una nueva clase que implemente una interfaz para reemplazar una dependencia actual en algunas o todas las situaciones, sin requerir un cambio en la clase dependiente; las clases nuevas y antiguas se pueden intercambiar libremente. El acoplamiento fuerte no lo permite.

Este es un diagrama UML que ilustra un ejemplo de acoplamiento flexible entre una clase dependiente y un conjunto de clases concretas, que proporcionan el comportamiento requerido:

Ejemplo de acoplamiento suelto.JPG

A modo de comparación, este diagrama ilustra el diseño alternativo con un fuerte acoplamiento entre la clase dependiente y un proveedor:

Ejemplo de acoplamiento fuerte.JPG

Otras formas

Los lenguajes de programación de computadoras que tienen nociones de funciones como módulo central (ver Programación funcional ) o funciones como objetos proporcionan excelentes ejemplos de programación poco acoplada. Los lenguajes funcionales tienen patrones de Continuaciones , Cierre o generadores. Consulte Clojure y Lisp como ejemplos de lenguajes de programación de funciones. Los lenguajes orientados a objetos como Smalltalk y Ruby tienen bloques de código, mientras que Eiffel tiene agentes. La idea básica es objetivar (encapsular como un objeto) una función independiente de cualquier otro concepto envolvente (por ejemplo, desacoplar una función de objeto de cualquier conocimiento directo del objeto envolvente). Consulte Función de primera clase para obtener más información sobre las funciones como objetos, que califica como una forma de función de primera clase.

Entonces, por ejemplo, en un lenguaje orientado a objetos, cuando se hace referencia a una función de un objeto como un objeto (liberándolo de tener conocimiento de su objeto host que lo encierra), el nuevo objeto de función puede pasarse, almacenarse y llamarse en un tiempo más tarde. Los objetos destinatarios (a quienes se les dan estos objetos funcionales) pueden ejecutar (llamar) de manera segura la función contenida a su conveniencia sin ningún conocimiento directo del objeto host circundante. De esta manera, un programa puede ejecutar cadenas o grupos de objetos funcionales, mientras se desacopla de manera segura de tener cualquier referencia directa al objeto host circundante.

Los números de teléfono son un excelente análogo y pueden ilustrar fácilmente el grado de este desacoplamiento.

Por ejemplo: alguna entidad proporciona a otra un número de teléfono para llamar y realizar un trabajo en particular. Cuando se llama al número, la entidad que llama efectivamente dice: "Por favor, haz este trabajo por mí". El desacoplamiento o acoplamiento flojo es inmediatamente evidente. La entidad que recibe el número para llamar puede no tener conocimiento de la procedencia del número (por ejemplo, una referencia al proveedor del número). Por otro lado, la persona que llama está desvinculada del conocimiento específico de a quién está llamando, dónde está y de cómo opera internamente el receptor de la llamada.

Llevando el ejemplo un paso más allá, la persona que llama podría decirle al receptor de la llamada: "Por favor, haz este trabajo por mí. Llámame a este número cuando hayas terminado". El "número" que se ofrece al receptor se denomina "Devolución de llamada". Una vez más, el acoplamiento flojo o la naturaleza desacoplada de este objeto funcional es evidente. El receptor de la devolución de llamada no sabe qué o quién está siendo llamado. Solo sabe que puede realizar la llamada y decide por sí mismo cuándo llamar. En realidad, es posible que la devolución de llamada ni siquiera sea para el que proporcionó la devolución de llamada en primer lugar. Este nivel de indirección es lo que hace que los objetos de función sean una tecnología excelente para lograr programas poco acoplados.

Acoplamiento de elementos de datos de medición

El grado de acoplamiento flojo se puede medir observando el número de cambios en los elementos de datos que podrían ocurrir en los sistemas de envío o recepción y determinando si las computadoras continuarían comunicándose correctamente. Estos cambios incluyen elementos como:

  1. Agregar nuevos elementos de datos a los mensajes
  2. Cambiar el orden de los elementos de datos
  3. Cambiar los nombres de los elementos de datos
  4. Cambiar las estructuras de los elementos de datos
  5. Omitir elementos de datos

Ver también

Referencias