El acoplamiento flexible es esencialmente la dependencia indirecta entre módulos sobre cómo pueden evolucionar.
Generalmente, cuando hay un sistema estrechamente acoplado, diferentes módulos / objetos tienen comportamientos muy específicos que asumen ese comportamiento de los objetos periféricos. Dichos objetos están vinculados / acoplados a comportamientos de otros módulos y no pueden reutilizarse de forma aislada ni en ningún otro contexto.
Dichos módulos, aunque son responsables de la funcionalidad individual, no pueden evolucionar independientemente o no pueden evolucionar.
Un ejemplo:
Digamos que tiene 3 objetos
Shape(un objeto modelo) y Canvas(un elemento UI). Ahora
Suponga que un método shape.draw(Canvas)dibujará un objeto en el plano suministrado por el plano del lienzo.
Ahora, a veces las ventanas están parcialmente cubiertas y cambian de tamaño. En tales casos, el método anterior podría hacer algo como esto.
shape::draw(Canvas) {
Rect.WindowLeft = Canvas.GetWindowRect.getLeftOffset();
Rect.LeftPixel = Canvas.GetWindowRect.pixels() + Rect.WindowLeft;
.... // like this get all co-ordinates.
draw_instance(Rect); // This will draw the actual shape.
}
Básicamente, aquí la función de dibujo recoge el rectángulo donde hay que dibujar cosas. Esto es fácil de entender (la gente podría llamar a esto simple ) código Sin embargo, este es un código extremadamente acoplado.
Imagina la situación:
- ¿Qué pasa si el mecanismo del lienzo para sostener ventanas ya no es un rectángulo?
- ¿Qué pasa si hay compensaciones adicionales que Canvas mantiene que es privado ?
- ¿Qué sucede si alguna otra aplicación quiere la misma forma pero ya no tiene una ventana GUI (por ejemplo, está creando imágenes y guardando en archivos)?
La causa raíz del problema es que el objeto shape sabe y, por lo tanto, está estrechamente relacionado con él Canvas.
Lo deseable es que se dé un conjunto de píxeles a la forma donde escribe; el shapeno debe tener (incluso implícito) conocimiento sobre dónde se escriben realmente los píxeles.