Згуртованість - це ознака того, наскільки пов'язані та зосереджені обов'язки програмного елемента.
З'єднання стосується того, наскільки сильно програмний елемент пов'язаний з іншими елементами.
Програмним елементом може бути клас, пакет, компонент, підсистема або система. І під час проектування систем рекомендується мати програмні елементи, які мають високу когезію та підтримку низької зв'язку .
Низька згуртованість призводить до монолітних класів, які важко підтримувати, розуміти та зменшують повторне використання. Аналогічно високі результати сполучення в класах, які щільно з'єднані і зміни, як правило, не є локальними, важко змінити і зменшують повторне використання.
Ми можемо прийняти гіпотетичний сценарій, коли ми розробляємо типовий монітор, здатний ConnectionPool
відповідати наступним вимогам. Зауважте, що це може виглядати занадто багато для простого класу, ConnectionPool
але основний намір полягає лише в тому, щоб продемонструвати низьку зв’язність і високу згуртованість з простим прикладом, і я думаю, що це повинно допомогти.
- підтримка отримання з'єднання
- відпустіть з'єднання
- отримати статистику про підключення та кількість використання
- отримати статистику про з'єднання проти часу
- Збережіть пошук з'єднання та випустіть інформацію в базу даних для подальшого звітування.
Маючи низьку згуртованість, ми могли б розробити ConnectionPool
клас, насильно склавши всю цю функціональність / обов'язки в один клас, як показано нижче. Ми можемо бачити, що цей єдиний клас відповідає за управління з’єднаннями, взаємодію з базою даних, а також за підтримку статистики зв’язку.
Маючи високу згуртованість, ми можемо розподілити цю відповідальність за всіма класами та зробити її більш доступною та багаторазовою.
Щоб продемонструвати низьке з'єднання, ми продовжимо ConnectionPool
схему високої згуртованості вище. Якщо ми подивимось на наведену вище діаграму, хоча вона підтримує високу згуртованість, то ConnectionPool
це тісно поєднане з ConnectionStatistics
класом і PersistentStore
взаємодіє з ними безпосередньо. Замість того, щоб зменшити зв'язок, ми могли б ввести ConnectionListener
інтерфейс і дозволити цим двом класам реалізувати інтерфейс і дозволити їм зареєструватися в ConnectionPool
класі. І ConnectionPool
воля повторюється через цих слухачів та повідомляє їх про події отримання та випуску зв'язку та дозволяє менше з'єднатись.
Примітка / слово або застереження: для цього простого сценарію це може виглядати як надмірне вбивство, але якщо ми уявляємо сценарій у реальному часі, коли для завершення транзакції нашому додатку необхідно взаємодіяти з декількома сторонніми послугами: безпосередньо з'єднання нашого коду з сторонніми послугами означало б, що будь-які зміни в сторонній службі можуть призвести до зміни нашого коду в декількох місцях, натомість ми могли б мати Facade
те, що взаємодіє з цими декількома службами внутрішньо, і будь-які зміни в послугах стають локальними Facade
і примушують низьке з'єднання з третьою стороною послуги.