'Acoplamiento' es un término que describe la relación entre dos entidades en un sistema de software (generalmente clases).
Cuando una clase usa otra clase, o se comunica con ella, se dice que 'depende' de esa otra clase, por lo que estas clases están 'acopladas'. Al menos uno de ellos 'sabe' sobre el otro.
La idea es que deberíamos tratar de mantener el acoplamiento entre clases en nuestros sistemas lo más 'flojo' posible: por lo tanto, 'acoplamiento flojo' o, a veces, 'desacoplamiento' (aunque en inglés 'desacoplamiento' significaría 'ningún acoplamiento en absoluto', la gente a menudo lo usa para implicar 'acoplamiento flojo' entre entidades)
Entonces: ¿qué es el acoplamiento flojo versus el acoplamiento fuerte en la práctica, y por qué deberíamos hacer que las entidades se acoplen libremente?
El acoplamiento describe el grado de dependencia entre una entidad y otra entidad. A menudo clases u objetos.
Cuando la Clase A depende en gran medida de la Clase B, las posibilidades de que se vea afectada cuando se cambia la Clase B son altas. Este es un fuerte acoplamiento.
Sin embargo, si la Clase A depende ligeramente de la Clase B, entonces las posibilidades de que la Clase A se vea afectada de alguna manera por un cambio en el código de la Clase B son bajas. Esto es acoplamiento flojo, o una relación 'desacoplada'.
El acoplamiento flojo es bueno porque no queremos que los componentes de nuestro sistema dependan mucho entre sí. Queremos mantener nuestro sistema modular, donde podamos cambiar de manera segura una parte sin afectar la otra.
Cuando dos partes se acoplan libremente, son más independientes entre sí y es menos probable que se rompan cuando la otra cambia.
Por ejemplo, al construir un automóvil, no querrá que un cambio interno en el motor rompa algo en el volante.
Si bien esto nunca sucedería por accidente al construir un automóvil, a los programadores les ocurren cosas similares todo el tiempo. El acoplamiento flojo está destinado a reducir el riesgo de que tales cosas sucedan.
El acoplamiento fuerte generalmente ocurre cuando la entidad A sabe demasiado sobre la entidad B. Si la entidad A hace demasiadas suposiciones sobre cómo opera la entidad B o cómo se construye, entonces existe un alto riesgo de que un cambio en la entidad B afecte a la entidad A. Esto es porque uno de sus supuestos sobre la entidad B ahora es incorrecto.
Por ejemplo, imagine que, como conductor, haría ciertas suposiciones sobre cómo funciona el motor de su automóvil.
El día que compre un automóvil nuevo con un motor que funcione de manera diferente (o por alguna razón se reemplazó su motor), sus suposiciones anteriores serían incorrectas. Si fuera código en una computadora, ahora sería un código incorrecto que no funciona correctamente.
Sin embargo, si todas las suposiciones que hizo como conductor acerca de los automóviles es que: A- tienen volantes y B- tienen pedales de freno y de gas, entonces los cambios en el automóvil no lo afectarán, siempre que sus pocas suposiciones mantente correcto Esto es acoplamiento flojo.
Una técnica importante para lograr un acoplamiento flojo es la encapsulación. La idea es que una clase oculta sus detalles internos de otras clases y ofrece una interfaz estrictamente definida para que otras clases se comuniquen con ella.
Así, por ejemplo, si se está definiendo un coche de clase, su interfaz (métodos públicos) sería probablemente drive()
, stop()
, steerLeft()
, steerRight()
, getSpeed()
. Estos son los métodos que otros objetos pueden invocar en los objetos Car.
Todos los demás detalles de la clase Car: cómo funciona el motor, el tipo de combustible que usa, etc., están ocultos de otras clases, para evitar que sepan demasiado sobre Car.
En el momento en que la clase A sabe demasiado sobre la clase B: tenemos una relación fuertemente acoplada, donde la clase A es demasiado dependiente de la clase B y es probable que un cambio en la clase B afecte a la clase A. Haciendo que el sistema sea difícil de expandir y mantener.
Una relación entre dos entidades, donde se conocen poco entre sí (solo lo que es necesario), es una relación débilmente acoplada o desacoplada.