Вільне з'єднання - це по суті опосередкована залежність між модулем від того, як вони можуть розвиватися.
Як правило, коли існує щільно пов'язана система, різні модулі / об'єкти мають дуже специфічну поведінку, яка передбачає таку поведінку периферійних об'єктів. Такі об'єкти пов'язані / пов'язані з поведінкою інших модулів, і їх не можна повторно використовувати ізольовано або в будь-якому іншому контексті.
Такі модулі, незважаючи на те, що відповідають за окремі функціональні можливості, не можуть еволюціонувати самостійно або не можуть розвиватися
Приклад:
Скажімо, у вас є 3 об’єкти
Shape(об’єкт моделі) та Canvas(елемент інтерфейсу). Тепер
Припустимо, що метод shape.draw(Canvas)намалює предмет на площині, що подається площиною полотна.
Зараз іноді вікна частково накриваються і змінюються розміри. У таких випадках вищевказаний метод може просто зробити щось подібне.
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.
}
В основному, тут функція малювання підбирає прямокутник, куди потрібно намалювати речі. Це легко зрозуміти (люди можуть назвати цей простий ) код. Однак це надзвичайно поєднаний код.
Уявіть ситуацію:
- Що робити, якщо полотно механізму утримування вікон більше не є прямокутником?
- що робити, якщо є додаткові компенсації, які зберігає Canvas, які є приватними ?
- Що робити, якщо якась інша програма хоче такої ж форми, але більше не має вікна графічного інтерфейсу (наприклад, це створення зображень та збереження у файлах).
Першопричиною проблеми є те, що об'єкт shape знає і, отже, щільно поєднується з Canvas.
Що бажано, щоб набір пікселів був наданий формі, де він пише; shapeне повинно бути (навіть неявній) знання про те, де пікселі на насправді написано.