# Різниця між coupling та cohesion

Це терміни із принципів розробки ПЗ.

Метою етапу проектування у життєвому циклі розробки програмного забезпечення є створення вирішення проблеми, зазначеної у документі SRS (Специфікація вимог до програмного забезпечення). Результатом етапу проектування є проектний документ програмного забезпечення (SDD).

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

Концептуальний проект системи:

* Написано простою мовою, тобто. зрозумілою для клієнта мовою.
* Докладне пояснення параметрів системи.
* Визначає функціональність системи.
* Це залежить від реалізації.
* Пов'язаний із документом вимоги.

Технічний проект системи:

* Апаратна складова та дизайн.
* Функціональність та ієрархія програмних компонентів.
* Архітектура програмного забезпечення
* Мережева архітектура
* Структура даних та потік даних.
* Компонент введення/виведення системи.
* Показує інтерфейс.

Модуляризація: модульність – це процес поділу програмної системи на кілька незалежних модулів, де кожен модуль працює незалежно. Є багато переваг модуляризації у розробці програмного забезпечення. Деякі з них наведені нижче:

* Легко зрозуміти систему.
* Обслуговування системи просте.
* Модуль може використовуватися багато разів відповідно до їх вимог. Немає потреби писати це знову і знову.

Зв'язок (Coupling): Зв'язок є мірою ступеня взаємозалежності між модулями. Хороше програмне забезпечення матиме низьку зв'язність.

Типи зв'язності:

* Зв'язок даних ( **Data Coupling** ): якщо залежність між модулями заснована на тому факті, що вони обмінюються даними, передаючи тільки дані, то кажуть, що модулі пов'язані даними. При з'єднанні даних компоненти незалежні один від одного та взаємодіють через дані. Комунікації модулів не містять бродячих даних (tramp data). Приклад – система розрахунків із клієнтами;
* Сполучність штампів ( **Stamp Coupling** ): При з'єднанні штампів повна структура даних передається від одного модуля до іншого. Отже, він включає tramp data. Це може бути необхідно з міркувань ефективності - цей вибір зробив проникливий дизайнер, а не лінивий програміст;
* Зв'язок управління ( **Control Coupling** ): якщо модулі взаємодіють, передаючи керуючу інформацію, то кажуть, що вони пов'язані управлінням. Може бути погано, якщо параметри вказують зовсім інше поведінка, і добре, якщо параметри дозволяють факторизувати та повторно використовувати функціональність. Приклад - функція сортування, що приймає функцію порівняння як аргумент;
* Зовнішній зв'язок ( **External Coupling** ): при зовнішній зв'язності модулі залежать від інших модулів, зовнішніх по відношенню до програмного забезпечення або апаратного забезпечення певного типу. Ex – протокол, зовнішній файл, формат пристрою тощо.
* Загальна зв'язність ( **Common Coupling** ): модулі мають загальні дані, такі як глобальні структури даних. Зміни глобальних даних означають відстеження всіх модулів, які звертаються до цих даних, для оцінки ефекту зміни. Таким чином, він має недоліки, такі як складність повторного використання модулів, обмежена здатність контролювати доступ до даних і менша ремонтопридатність.
* Зв'язок вмісту ( **Content Coupling** ): при зв'язності вмісту один модуль може змінювати дані іншого модуля, або потік управління передається від одного модуля до іншого модуля. Це найгірша форма зв'язності, її слід уникати.

Зчеплення/єдність/згуртованість (Cohesion): це міра ступеня, в якій елементи модуля функціонально пов'язані. Це ступінь, де всі елементи, створені задля виконання однієї завдання, містяться у компоненті. По суті, зчеплення – це внутрішній клей, який утримує модуль разом. Гарний дизайн програмного забезпечення матиме високе зчеплення.

Types of Cohesion:

* **Functional Cohesion** : компонент містить кожен важливий елемент для окремого обчислення. Функціональна згуртованість виконує завдання та функції. Це ідеальна ситуація.
* **Sequential Cohesion** : елемент виводить деякі дані, які стають вхідними даними іншого елемента, т. е. потік даних між частинами. Це відбувається природним чином у функціональних мовах програмування.
* **Communicational Cohesion** : два елементи працюють з одними й тими самими вхідними даними чи роблять свій внесок у одні й самі вихідні дані. Приклад – оновити запис у базі даних та надіслати його на принтер.
* **Procedural Cohesion** : Елементи процедурної єдності забезпечують порядок виконання. Дії, як і раніше, слабко пов'язані і малоймовірно, що їх можна буде використовувати повторно. Вирахувати середній бал студента, роздрукувати студентський звіт, розрахувати сукупний середній бал, роздрукувати сукупний середній бал.
* **Temporal Cohesion** : елементи пов'язані за власним часом. У модулі, пов'язаному з тимчасовою зв'язністю, всі завдання повинні виконуватися в той самий проміжок часу. Цей зв'язок містить код для ініціалізації всіх частин системи. Відбувається безліч різних процесів, і всі вони відбуваються в одиницю часу.
* **Logical Cohesion** : елементи пов'язані логічно, а чи не функціонально. Компонент Ex-A зчитує вхідні дані зі стрічки, диска та мережі. Весь код цих функцій міститься в одному компоненті. Операції споріднені, але функції значно різняться.
* **Coincidental Cohesion** : елементи не пов'язані (непов'язані). Елементи не мають жодного концептуального зв'язку, крім розташування у вихідному коді. Це випадковість та найгірша форма згуртованості. Вивести наступний рядок та поміняти місцями символи рядка в одному компоненті.

Джерела:

* [Coupling and Cohesion](https://translate.google.com/website?sl=auto\&tl=uk\&hl=uk\&u=https://www.geeksforgeeks.org/software-engineering-coupling-and-cohesion/?ref%3Dlbp)

Дод. матеріал:

* [Low Coupling та High Cohesion](https://translate.google.com/website?sl=auto\&tl=uk\&hl=uk\&u=https://medium.com/german-gorelkin/low-coupling-high-cohesion-d36369fb1be9)
* [ООП для ООП: GRASP](https://translate.google.com/website?sl=auto\&tl=uk\&hl=uk\&u=https://habr.com/ru/post/38323/)
