Зв'язність (англ.coupling) чи залежність (англ.dependency) — це міра, у якій модуль (компонент) програми залежить від кожного іншого модуля (використовує якусь інформацію про нього).
Зв'язність зазвичай протиставляється пов'язаності. Метрики програмного забезпечення зв'язність та пов'язаність, винайдені Ларрі Констянтином, першим розробником структурного проєктування,[1] який також був першим їхнім прихильником (див. також SSADM). Слабка зв'язність часто є ознакою добре структурованої комп'ютерної системи, та гарної архітектури, і в поєднанні з високою пов'язаністю дозволяє досягнути гарної прочитності та підтримуваності коду.
Зв'язність може бути «слабкою» (чи «низькою») або «сильною» («високою»). Розглянемо деякі види зв'язності в порядку від найвищих, до найнижчих:
Процедурне програмування
Зв'язність за вмістом (сильна)
З'являється, коли один модуль модифікує або залежить від внутрішнього вмісту іншого модуля (наприклад, використовує його змінні).
Тому зміна способу, яким другий модуль обробляє дані, вимагатиме зміни залежного модуля.
Зв'язність за спільністю даних
Коли два модулі мають спільні глобальні дані (глобальні змінні).
Зміна спільного ресурсу передбачає зміну всіх модулів що його використовують.
Зовнішня зв'язність
З'являється коли два модулі поділяють нав'язаний ззовні формат даних, протокол комунікації чи інтерфейс пристрою. Зазвичай це пов'язане з взаємодією з зовнішніми інструментами чи апаратурою.
Зв'язність контролю
З'являється коли один модуль контролює хід роботи іншого, передаючи йому інформацію про те що робити.
Залежність-штамп (Залежність від структурованих даних)
коли модулі мають спільну складну структуру даних, і використовують лише її частини, можливо різні (наприклад функції передається запис, хоча вона потребує лише його частину).
Зв'язність даних
Зв'язність даних виникає коли модулі діляться спільними даними через, наприклад, параметри. Кожне дане є елементарним, і єдиним яке ділиться (наприклад передача числа функції що обчислює квадратний корінь).
Зв'язність через повідомлення (слабка)
Найслабший тип зв'язності. Досягається за допомогою децентралізації стану (в об'єктах). Взаємодія компонентів проводиться через параметри та обмін повідомленнями.
Відсутня
Модулі взагалі не взаємодіють між собою.
Об'єктно-орієнтоване програмування
Зв'язність підкласу
Описує взаємозв'язок між предком та нащадком. Нащадок прив'язаний до предка, а предок ні.
Тимчасова зв'язність
Коли дві дії упаковані в один модуль лише тому, що вони можуть відбуваються одночасно.
У недавній праці інші концепції зв'язності були вивчені та використані як ознаки різних принципів модульності, що використовуються на практиці.[2]
Сильно зв'язні системи зазвичай демонструють наступні характеристики розробки, які часто розглядаються як недоліки:
Зміна одного модуля зазвичай викликає хвилю змін в інших модулях
Збирання модулів до купи та стиковка вимагатиме більше зусиль та часу, через збільшення міжмодульних залежностей
Конкретний модуль важче буде повторно використати та/або тестувати, тому що потрібно включити залежні модулі.
Незалежно від сили зв'язності, продуктивність системи зменшується через створення повідомлень та параметрів, їх передавання, трансляцію та інтерпретацію. Дивіться подійно-орієнтоване програмування.
Витрати на створення повідомлень
Створення будь-якого повідомлення вимагає додаткових витрат як процесора так і пам'яті. Створення цілочисельного повідомлення (яке може бути посиланням на рядок, масив чи іншу структуру даних) вимагає менших витрат, ніж створення складного повідомлення такого як наприклад у SOAP. Для оптимізації потрібно зменшувати довжину повідомлення та збільшувати міру вмісту, яка в нього вкладається.
Витрати на передачу повідомлень
Оскільки для отримання змісту, повідомлення потрібно передати повністю, потрібно це оптимізувати. Коротші повідомлення передаються і приймаються швидше.
Витрати на трансляцію повідомлень
Протоколи повідомлень, і вони самі часто містять надлишкову інформацію (наприклад опис пакету і його структури). Тому отримувач часто потребує перетворення повідомлення в простішу форму, видаленням додаткових символів та інформації про структуру та/або приведенням типу значень до потрібного. Для оптимізації процесів трансляції повідомлення знову ж таки має мати якомога меншу довжину, за якомога більшого вмісту.
Витрати на інтерпретацію повідомлень
всі повідомлення мають інтерпретуватися приймачем. Прості повідомлення, такі як цілі, можуть не вимагати додаткової обробки. Проте, складні повідомлення, наприклад у SOAP, потребують парсера та перетворення рядків для відтворення змісту.
Одним з підходів до зменшення зв'язності є функціональне проєктування, яке намагається обмежити відповідальності модулів у функціональності.
Слабка зв'язність виникає тоді, коли один модуль взаємодіє з іншим через простий та стабільний інтерфейс і його не хвилює як реалізований інший модуль. (дивіться: Інкапсуляція).
Такі системи як CORBA чи COM дозволяють об'єктам взаємодіяти між собою без необхідності знати що-небудь про реалізацію один одного. Обидві системи навіть дозволяють взаємодію між об'єктами написаними різними мовами.
Зв'язність та пов'язаність— два терміни, які дуже часто вживаються разом. Вони описують якості, які повинні мати модулі. Зв'язність характеризує взаємозв'язки між модулями, а пов'язаність описує зв'язок функцій усередині модуля. Низька пов'язаність спричиняє ситуацію, коли модуль виконує різні непов'язані завдання, і починає створювати проблеми, коли модуль стає великим.
У книзі «Software Engineering»[3] зв'язність описує варіант метрики пов'язаної з цим терміном.
Для зв'язності даних та потоку керування:
di: кількість вхідних параметрів даних
ci: кількість вхідних контрольних параметрів
do: кількість вихідних параметрів даних
co: кількість вихідних контрольних параметрів
Для глобальної зв'язності:
gd: кількість глобальних змінних, які використовуються як дані
gc: кількість глобальних змінних, які використовуються для контролю
Для зв'язності середовищ:
w: кількість викликаних модулів (fan-out)
r: кількість модулів, що викликають модуль, який розглядається (fan-in)
Coupling(C) має тим більше значення, чим більш зв'язним є модуль. Це число варіюється від приблизно 0.67 (слабка зв'язність) до 1.0 (сильна зв'язність)
Наприклад, якщо модуль має лише один вхідний, і один вихідний параметри:
Якщо модуль має 5 вхідних та вихідних параметрів, таке ж число контрольних параметрів, і використовує 10 глобальних змінних, викликає 3 модулі, і викликається чотирма,
F. Beck, S. Diehl. On the Congruence of Modularity and Code Coupling. In Proceedings of the 19th ACM SIGSOFT Symposium and the 13th European Conference on Foundations of Software Engineering (SIGSOFT/FSE '11), Szeged, Hungary, September 2011. DOI:10.1145/2025113.2025162