Різниця між згуртованістю та зв'язком


486

Яка різниця між згуртованістю та зв’язковістю?

Як з'єднання та згуртованість можуть призвести до гарного чи поганого дизайну програмного забезпечення?

Наведіть декілька прикладів, які окреслюють різницю між ними та їх вплив на загальну якість коду?




4
Це останнє повідомлення на цю тему
janisz

Відповіді:


702

Згуртованість означає те, що може зробити клас (або модуль). Низька згуртованість означала б, що клас робить дуже різноманітні дії - він широкий, не зосереджений на тому, що він повинен робити. Висока згуртованість означає, що клас орієнтований на те, що він повинен робити, тобто лише на методи, що стосуються наміру класу.

Приклад низької згуртованості:

-------------------
| Staff           |
-------------------
| checkEmail()    |
| sendEmail()     |
| emailValidate() |
| PrintLetter()   |
-------------------

Приклад високої згуртованості:

----------------------------
| Staff                   |
----------------------------
| -salary                 |
| -emailAddr              |
----------------------------
| setSalary(newSalary)    |
| getSalary()             |
| setEmailAddr(newEmail)  |
| getEmailAddr()          |
----------------------------

Що стосується з’єднання , воно стосується того, наскільки два або залежні між собою два класи / модулі спрямовані один до одного. Для низько зв'язаних класів зміна чогось основного в одному класі не повинна впливати на інший. Висока зв'язок ускладнить зміну та підтримку вашого коду; оскільки заняття тісно пов'язані між собою, для внесення змін може знадобитися оновлення всієї системи.

Хороший дизайн програмного забезпечення має високу згуртованість і низьке з'єднання .


12
Я не бачу, як видалення кількох методів, а додавання кількох інших збільшує згуртованість. Може хтось тут допоможе, будь ласка?
Saket Jain

3
@SaketJain це не просто видалення деяких методів та додавання деяких інших. саме так методи пов'язані з метою класу (якщо це пояснення зрозуміліше).
mauris

4
приклад низької згуртованості на вершині виглядає досить добре, я думаю, ви випадково мали намір сказати "висока згуртованість"
повторити

37
@SaketJain Клас персоналу - це не місце, де ми перевіряємо, надсилаємо чи перевіряємо електронні листи. Ці функції повинні входити до гіпотетичного класу електронної пошти, тому це низька згуртованість. У другому прикладі клас Персонал містить лише належну інформацію для встановлення та отримання даних щодо персоналу. Вони не виконують дій, якими повинен керувати інший клас.
Антоніо Пантано

3
@JonathanC у прикладах не потрібно доводити різницю (як, наприклад, у математичному доказі), щоб все-таки бути прикладом. Не соромтесь відповідати чи коментувати будь-які приклади, які, на вашу думку, є кориснішими. Функції set& getілюструють функціональність, більш конкретну для контексту "Персонал" - чим вища специфіка надає цьому прикладу його більшу згуртованість.
cellepo

81

Згуртованість - це ознака взаємозв'язку всередині модуля.

З'єднання - це вказівка ​​зв'язків між модулями.

введіть тут опис зображення

Згуртованість

  • Згуртованість - це ознака взаємозв'язку всередині модуля.
  • Згуртованість показує відносну функціональну міцність модуля.
  • Згуртованість - це ступінь (якість), на якій компонент / модуль зосереджується на одній речі.
  • Під час проектування ви повинні прагнути до високої згуртованості, тобто згуртованості компонента / модуля, зосередженості на одній задачі (тобто однодумності) з невеликою взаємодією з іншими модулями системи.
  • Згуртованість - це вид природного розширення даних, що приховується, наприклад, клас, у якому всі члени видимі з пакетом, який має видимість за умовчанням. Згуртованість - це внутрішньомодульна концепція.

Зчеплення

  • З'єднання - це вказівка ​​зв'язків між модулями.
  • З'єднання показує відносну залежність / взаємозалежність між модулями.
  • З'єднання - це ступінь, до якого компонент / модуль підключається до інших модулів.
  • Під час проектування ви повинні прагнути до низької зв'язку, тобто залежність між модулями повинна бути меншою
  • Створення приватних полів, приватних методів та недержавних класів забезпечує слабке з'єднання.
  • З'єднання - це концепція Inter -Module.

перевірте це посилання


77

Висока згуртованість всередині модулів і низьке з'єднання між модулями часто вважаються пов'язаними з високою якістю в мовах програмування ОО.

Наприклад, код усередині кожного класу Java повинен мати високу внутрішню згуртованість, але бути максимально вільно пов'язаним з кодом в інших класах Java.

Розділ 3 «Об’єктно-орієнтована побудова програмного забезпечення Мейєра» (2-е видання) - чудовий опис цих проблем.


3
Поняття насправді не обмежуються програмуванням ОО. Якщо що, я б припустив, що метою мов OO є спрямування програміста на досягнення високої згуртованості / низької зв'язку.
Хатч

57

Згуртованість - це ознака того, наскільки пов'язані та зосереджені обов'язки програмного елемента.

З'єднання стосується того, наскільки сильно програмний елемент пов'язаний з іншими елементами.

Програмним елементом може бути клас, пакет, компонент, підсистема або система. І під час проектування систем рекомендується мати програмні елементи, які мають високу когезію та підтримку низької зв'язку .

Низька згуртованість призводить до монолітних класів, які важко підтримувати, розуміти та зменшують повторне використання. Аналогічно високі результати сполучення в класах, які щільно з'єднані і зміни, як правило, не є локальними, важко змінити і зменшують повторне використання.

Ми можемо прийняти гіпотетичний сценарій, коли ми розробляємо типовий монітор, здатний ConnectionPoolвідповідати наступним вимогам. Зауважте, що це може виглядати занадто багато для простого класу, ConnectionPoolале основний намір полягає лише в тому, щоб продемонструвати низьку зв’язність і високу згуртованість з простим прикладом, і я думаю, що це повинно допомогти.

  1. підтримка отримання з'єднання
  2. відпустіть з'єднання
  3. отримати статистику про підключення та кількість використання
  4. отримати статистику про з'єднання проти часу
  5. Збережіть пошук з'єднання та випустіть інформацію в базу даних для подальшого звітування.

Маючи низьку згуртованість, ми могли б розробити ConnectionPoolклас, насильно склавши всю цю функціональність / обов'язки в один клас, як показано нижче. Ми можемо бачити, що цей єдиний клас відповідає за управління з’єднаннями, взаємодію з базою даних, а також за підтримку статистики зв’язку.

Басейн з низьким рівнем згуртованості

Маючи високу згуртованість, ми можемо розподілити цю відповідальність за всіма класами та зробити її більш доступною та багаторазовою.

Басейн з високою когезією

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

Басейн з низьким з'єднанням

Примітка / слово або застереження: для цього простого сценарію це може виглядати як надмірне вбивство, але якщо ми уявляємо сценарій у реальному часі, коли для завершення транзакції нашому додатку необхідно взаємодіяти з декількома сторонніми послугами: безпосередньо з'єднання нашого коду з сторонніми послугами означало б, що будь-які зміни в сторонній службі можуть призвести до зміни нашого коду в декількох місцях, натомість ми могли б мати Facadeте, що взаємодіє з цими декількома службами внутрішньо, і будь-які зміни в послугах стають локальними Facadeі примушують низьке з'єднання з третьою стороною послуги.


3
Відмінна відповідь! Якщо можливо, ви могли б скористатись іншим прикладом? Пул підключення може бути зрозумілий не всім. Незалежно, це мені справді допомогло. Тож дякую!
Saket Jain

як використання інтерфейсу ConnectionListener допомагає зменшити з’єднання? Чи можете ви навести приклад, простіший для розуміння.
abhishek gupta

1
@abhishekgupta У цьому прикладі ви, можливо, помітили, що ми використовували схему спостерігачів для досягнення низької / вільної зв'язку. Досягнення цього допоможе, як спостерігач створює дизайн, що з’єднується з нестабільною зв'язком?
Мадхусудана Редді Суннапу

33

Підвищена згуртованість та зменшене з'єднання призводять до гарного дизайну програмного забезпечення.

Згуртований розділ вашої функціональності таким чином, щоб він був стислим і наближався до релевантних йому даних, в той час як розв'язка гарантує, що функціональна реалізація буде ізольована від решти системи.

Розв’язка дозволяє змінити реалізацію, не впливаючи на інші частини вашого програмного забезпечення.

Згуртованість гарантує, що реалізація більш специфічна для функціональності і в той же час легша в обслуговуванні.

Найбільш ефективним методом зменшення з'єднання та збільшення згуртованості є проектування за допомогою інтерфейсу .

Це основні функціональні об'єкти повинні «пізнавати» один одного через інтерфейс (и), які вони реалізують. Реалізація інтерфейсу вводить згуртованість як природний наслідок.

Хоча в деяких сенаріях не реалістично, це має бути дизайнерською метою.

Приклад (дуже схематичний):

public interface IStackoverFlowQuestion
      void SetAnswered(IUserProfile user);
      void VoteUp(IUserProfile user);
      void VoteDown(IUserProfile user);
}

public class NormalQuestion implements IStackoverflowQuestion {
      protected Integer vote_ = new Integer(0);
      protected IUserProfile user_ = null;
      protected IUserProfile answered_ = null;

      public void VoteUp(IUserProfile user) {
           vote_++;
           // code to ... add to user profile
      }

      public void VoteDown(IUserProfile user) {
          decrement and update profile
      }

      public SetAnswered(IUserProfile answer) {
           answered_ = answer
           // update u
      }
}

public class CommunityWikiQuestion implements IStackoverflowQuestion {
     public void VoteUp(IUserProfile user) { // do not update profile }
     public void VoteDown(IUserProfile user) { // do not update profile }
     public void SetAnswered(IUserProfile user) { // do not update profile }
}

Десь ще в кодовій базі ви можете мати модуль, який обробляє питання незалежно від того, що вони:

public class OtherModuleProcessor {
    public void Process(List<IStackoverflowQuestion> questions) {
       ... process each question.
    }
}

28

Найкраще пояснення згуртованості - це чистий код дядька Боба:

Класи повинні мати невелику кількість змінних екземплярів. Кожен із методів класу повинен маніпулювати однією або кількома з цих змінних. Загалом, чим більше змінних метод маніпулює, тим більш згуртованим є цей метод у своєму класі . Клас, у якому кожна змінна використовується кожним методом, є максимально згуртованим.

Взагалі не можна ні доцільно, ні можливо створювати такі максимально згуртовані класи; з іншого боку, ми хотіли б, щоб згуртованість була високою . Коли згуртованість висока, це означає, що методи та змінні класу є взаємозалежними і з’єднуються разом як логічне ціле.

Стратегія збереження малих функцій та скорочення списків параметрів може іноді призводити до поширення змінних екземплярів, які використовуються підмножиною методів. Коли це відбувається, це майже завжди означає, що є хоча б ще один клас, який намагається вийти з більшого класу. Вам слід спробувати розділити змінні та методи на два чи більше класи, щоб нові класи були більш згуртованими.


Я згоден, це, мабуть, найкраще пояснення, саме це мені подобається у дядька Боба, що він може пояснити власне значення кількома фразами. Знаючи це визначення, ви можете миттєво побачити, що потрібно зробити даному класу для підвищення його згуртованості.
Pawel Dubiel

13

просто, Згуртованість являє собою ступінь, в якому частина бази коду утворює логічно єдину, атомну одиницю. З'єднання , з іншого боку, являє собою ступінь, на який одна одиниця не залежить від інших. Іншими словами, це кількість з'єднань між двома або більше одиницями. Чим менше число, тим менша муфта.

По суті, висока згуртованість означає збереження частин кодової бази, які пов'язані один з одним, в одному місці. У той же час низьке з'єднання полягає в тому, щоб якомога більше відокремити незалежні частини кодової бази.

Типи коду з точки зору згуртованості та зв'язку:

Ідеальним є код, який слідує керівництву. Він слабко з’єднаний і дуже згуртований. Ми можемо проілюструвати такий код цим малюнком:введіть тут опис зображення

Бог Об'єкт є результатом впровадження високої згуртованості та високої зв'язку. Це анти-шаблон і в основному означає один фрагмент коду, який виконує всю роботу за один раз: погано вибраний має місце, коли межі між різними класами або модулями вибрані погановведіть тут опис зображення введіть тут опис зображення

Деструктивна розв'язка - найцікавіша. Іноді це виникає, коли програміст намагається розв'язати базу коду настільки, що код повністю втрачає фокус:введіть тут опис зображення

докладніше читайте тут


1
Чудова стаття та ілюстрації! Якщо я можу запропонувати вдосконалити лише одну думку, мені подобається, як «погано вибраний» зберігає групи компонентів з непов’язаною семантикою у маленьких роях, але, думаю, у них повинно бути помітно більше стрілок між ними. Зрештою, навіть на ваших графіках на 4 квадрата це саме те, що потрапляє у верхній діапазон осі "З'єднання".
Славомир Бжезінський

1
Я б також сказав, що "погано вибраний" повинен мати менше стрілок всередині кожного рою. Використовуючи приклад "структури папок" зі своєї статті, який ви класифікуєте як "погано вибрані" сховища чи фабрики, звичайно, не будуть спілкуватися один з одним.
Славомир Бжезінський

ОНОВЛЕННЯ: Я підніс ці пропозиції до оригінального автора зображення, і автор погодився з ними .
Славомир Бжезінський

11

Згуртованість в інженерії програмного забезпечення - це ступінь спільності елементів певного модуля. Таким чином, це міра того, наскільки сильно пов'язаний кожен фрагмент функціональності, виражений вихідним кодом програмного модуля.

Сполучення простих слів - це те, наскільки один компонент (знову ж, уявіть собі клас, хоча і не обов'язково) знає про внутрішні роботи або внутрішні елементи іншого, тобто скільки знань він має про інший компонент.

Я писав про це в блозі , якщо ви хочете прочитати трохи детальніше з прикладами та малюнками. Я думаю, що це відповідає на більшість ваших питань.


4

введіть тут опис зображення

згуртованість стосується всього того, як створений єдиний клас. Згуртованість - це об'єктно-орієнтований принцип, найбільш тісно пов'язаний із забезпеченням того, щоб клас був розроблений з єдиною цілеспрямованою метою. Чим більш цілеспрямований клас, тим більше є згуртованість цього класу. Переваги високої згуртованості полягають у тому, що такі класи набагато легше підтримувати (і рідше змінювати), ніж класи з низькою згуртованістю. Ще одна перевага високої згуртованості полягає в тому, що класи з цілеспрямованою метою, як правило, більше використовуються, ніж інші класи.

На наведеному вище зображенні ми бачимо, що в умовах низької згуртованості лише один клас відповідає за виконання багатьох завдань, які не є спільними, що знижує ймовірність повторного використання та обслуговування. Але в умовах високої згуртованості існує окремий клас для всіх завдань для виконання певної роботи, що призводить до кращої зручності використання та обслуговування.


2

Згуртованість (Co-hesion): Co, що означає разом , hesion, що означає прилипати . Система злипання частинок різних речовин.

На прикладі реального життя: надайте любезність
введіть тут опис зображення

Весь більший, ніж сума частин - Арістотель.

  • Згуртованість є порядковим типом вимірювання і зазвичай його називають "високою когезією" або "низькою когезією". Модулі з високою когезією, як правило, є кращими, оскільки висока згуртованість пов'язана з кількома бажаними рисами програмного забезпечення, включаючи надійність, надійність, повторне використання та зрозумілість. Навпаки, низька згуртованість пов'язана з небажаними ознаками, такими як важкість у підтримці, тестуванні, повторному використанні або навіть розумінні. вікі

  • Зв'язок, як правило, протиставляється згуртованості . Низьке сполучення часто корелює з високою когезією, і навпаки. Низька зв'язок часто є ознакою добре структурованої комп'ютерної системи та гарного дизайну, а в поєднанні з високою згуртованістю підтримує загальні цілі високої читабельності та ремонтопридатності. вікі


1

Я думаю, що відмінності можна викласти так:

  • Згуртованість являє собою ступінь, в якому частина бази коду утворює логічно єдину, атомну одиницю.
  • З'єднання являє собою ступінь, на який одна одиниця не залежить від інших.
  • Неможливо архівувати повну розв'язку, не пошкоджуючи згуртованість, і навпаки.

У цій публікації в блозі я пишу про це детальніше.


1

Згуртованість - це показник відносної функціональної міцності модуля.

  • Згуртований модуль виконує єдине завдання, вимагаючи невеликої взаємодії з іншими компонентами в інших частинах програми. Якщо говорити просто, то згуртований модуль повинен (в ідеалі) робити лише одне.
  • Конвенційний вид:

    «однодумність» модуля

  • ViewOO перегляд:

    Hesionкогезія означає, що компонент або клас інкапсулює лише ті атрибути та операції, які тісно пов'язані один з одним і з самим класом або компонентом

  • Рівні згуртованості

    Функціональний

     Шар

    Комунікаційні

     Послідовний

    Процедуральна

    Темпоральний

    Корисність

З'єднання - це ознака відносної взаємозалежності між модулями.

  • З'єднання залежить від складності інтерфейсу між модулями, точки, в якій робиться запис або посилання на модуль, і того, які дані передаються через інтерфейс.

  • Звичайний вигляд: ступінь, до якого компонент пов'язаний з іншими компонентами та із зовнішнім світом

  • Погляд ОО: якісна міра ступеня, до якої класи пов'язані один з одним

  • Рівень зчеплення

    Зміст

    Загальні

    Контроль

    Перевірка

    Дані

    Ручний дзвінок

    Використання типу

     Включення або імпорт

     Зовнішній #


1

З'єднання = взаємодія / взаємозв'язок між двома модулями ... Згуртованість = взаємодія між двома елементами в модулі.

Програмне забезпечення складається з багатьох модулів. Модуль складається з елементів. Розглянемо модуль - це програма. Функція в рамках програми - це елемент.

На час виконання, вихід програми використовується як вхід для іншої програми. Це називається взаємодія модуля з модулем або процес для обробки зв'язку. Це також називається зчепленням.

У межах однієї програми вихід функції переходить до іншої функції. Це називається взаємодія елементів всередині модуля. Це також називається згуртованістю.

Приклад:

З'єднання = спілкування між двома різними сім’ями ... Згуртованість = спілкування між батьком-матір'ю-дитиною в сім'ї.


1
Тож як ви їх пояснюєте в контексті їх впливу на програмне забезпечення?
Ітбан Саїд

Програмне забезпечення складається з багатьох модулів. Модуль складається з елементів. Розглянемо модуль - це програма. Функція в рамках програми - це елемент.
Dipankar Nalui

1

Простіше кажучи, згуртованість означає, що клас повинен представляти єдине поняття.

Публічний інтерфейс класу є згуртованим, якщо всі функції класу пов'язані з концепцією, яку представляє клас. Наприклад, замість класу CashRegister, наявність функцій CashRegister та Coin згуртованість перетворює її на 2 класи - CashRegister та Coin class.

У муфті один клас залежить від іншого, оскільки він використовує об'єкти класу.

Проблема з високою муфтою полягає в тому, що вона може створювати побічні ефекти. Одна зміна в одному класі може призвести до несподіваної помилки в іншому класі і може зламати весь код.

Взагалі, високий рівень згуртованості та низьке з'єднання вважаються високоякісним OOP.


0

Термін згуртованість насправді трохи протилежне інтуїтивному значенню в розробці програмного забезпечення.

Загальний сенс згуртованості полягає в тому, що те, що добре злипається, єднається, що характеризується сильним зв’язком, як молекулярне притягання. Однак при розробці програмного забезпечення це означає прагнення до класу, який в ідеалі виконує лише одне, тому кілька підмодулів навіть не задіяні.

Можливо, ми можемо думати про це так. Частина має найбільшу згуртованість, коли вона є єдиною частиною (робить лише одне і не може бути розбита далі). Це те, що бажано в розробці програмного забезпечення. Згуртованість просто інша назва "єдиної відповідальності" або "роз'єднання проблем".

Термін з'єднання на руці є досить інтуїтивним, що означає, коли модуль не залежить від занадто багатьох інших модулів, і ті, з якими він з'єднується, можуть бути легко замінені, наприклад, дотримуючись принципу заміни ліскова .


Чому люди продовжують використовувати модуль слова замість класу?
сіверянин

1
@northerner - це просто більш загальний термін.
зар

0

Різниця теорії

Згуртованість

  • Згуртованість - це показник відносної функціональної міцності модуля.
  • Згуртований модуль виконує єдине завдання, вимагаючи невеликої взаємодії з іншими компонентами в інших частинах програми.
  • Кажуть, що модуль, що має високу когезію та низьке з'єднання, функціонально не залежить від іншого модуля.

Класифікація згуртованості

1.Випадковий 2.Логічний 3.Темпоральний 4.Процедуральний 5.Комунікація 6.Послідовний 7.Функціональний

Зчеплення

  • З'єднання - це ознака відносної взаємозалежності між модулями.
  • Ступінь зв'язку між двома модулями залежить від їх складності інтерфейсу.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.