Зв'язність (програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Зв'язність (англ. coupling) чи залежність (англ. dependency) це міра в якій модуль програми залежить від кожного іншого модуля.

Зв'язність зазвичай протиставляється пов'язаності. Метрики програмного забезпечення зв'язність та пов'язаність, винайдені Ларрі Констянтином, першим розробником Structured Design,[1] що також був першим їхнім прихильником (дивіться також SSADM). Слабка зв'язність часто є ознакою добре структурованої комп'ютерної системи, та гарної архітектури, і в поєднанні з високою пов'язаністю дозволяє досягнути гарної прочитності та підтримуваності коду.

Види зв'язності[ред.ред. код]

Концептуальна модель зв'язності

Зв'язність може бути "слабкою" (чи низькою) або "сильною" ("високою"). Розглянемо деякі види зв'язності в порядку від найвищих, до найнижчих:

Зв'язність за вмістом (сильна)
З'являється коли один модуль модифікує, чи залежить від внутрішнього вмісту іншого модуля (наприклад використовуює його змінні).
Тому зміна способу якими другий модуль обробляє дані вимагатиме зміни залежного модуля.
Зв'язність за спільністю даних
Коли два модулі мають спільні глобальні дані (глобальні змінні)
Зміна спільного ресурсу передбачає зміну всіх модулів що його використовують.
Зовнішня зв'язність
з'являється коли два модулі поділяють нав'язаний ззовні формат даних, протокол комунікації чи інтерфейс пристрою. Це звичай пов'язане з взаємодією з зовнішніми інструментами чи апаратурою.
Зв'язність контролю
з'являється коли один модуль контролює хід роботи іншого, передаючи йому інформацію про те що робити.
Stamp coupling (Data-structured coupling)
коли модулі мають спільну складну структуру даних, і використовують лише її частини, можливо різні (наприклад функції передається запис, хоча вона потребує лише його частину).
Зв'язність даних
Зв'язність даних виникає коли модулі діляться спільними даними через, наприклад, параметри. Кожне дане є елементарним, і єдиним яке ділиться (наприклад передача числа функції що обчислює квадратний корінь).
Зв'язність через повідомлення (слабка)
Найслабший тип зв'язності. Досягається за допомогою децентралізації стану (в об'єктах). Взаємодія компонентів проводиться через параметри та обмін повідомленнями.
Відсутня
Модулі взагалі не взаємодіють між собою.

ООП[ред.ред. код]

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

Недоліки[ред.ред. код]

Сильно зв'язні системи як правило демонструють наступні характеристики розробки, які часто розглядаються як недоліки:

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

Проблеми продуктивності[ред.ред. код]

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

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

Способи зменшення[ред.ред. код]

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

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

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

Зв'язність та пов'язаність[ред.ред. код]

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

Зв'язність модулів[ред.ред. код]

В книзі "Software Engineering"[2] зв'язність описує варіант метрики пов'язаної з цим терміном.

Для зв'язності даних та потоку керування:

  • di: кількість вхідних параметрів даних
  • ci: кількість вхідних контрольних параметрів
  • do: кількість вихідних параметрів даних
  • co: кількість вихідних контрольних параметрів

Для глобальної зв'язності:

  • gd: кількість глобальних змінних які використовуються як дані
  • gc: кількість глобальних змінних які використовуються для конролю

Для зв'язності середовищ:

  • w: кількість викликаних модулів (fan-out)
  • r: кількість модулів що викликають модуль який розглядається (fan-in)

\mathrm{Coupling}(C) = 1 - \frac{1}{d_{i} + 2\times c_{i} + d_{o} + 2\times c_{o} + g_{d} + 2\times g_{c} + w + r}

Coupling(C) має тим більше значення, чим більш зв'язним є модуль. Це число варіюється від приблизно 0.67 (слабка зв'язність) до 1.0 (сильна зв'язність)

Наприклад, якщо модуль має лише один вхідний, і один вихідний параметри:

C = 1 - \frac{1}{1+0+1+0+0+0+1+0} = 1 - \frac{1}{3} \approx 0.67

Якщо модуль має 5 вхідних та вихідних параметрів, таке ж число контрольних параметрів, і використовує 10 глобальних змінних, викликає 3 модулі, і викликається чотирма,

C = 1 - \frac{1}{5 + 2\times 5 + 5 + 2\times 5 + 10 + 0 + 3 + 4} = 0.98


Дивіться також[ред.ред. код]

Зноски[ред.ред. код]

  1. W. Stevens, G. Myers, L. Constantine, "Structured Design", IBM Systems Journal, 13 (2), 115-139, 1974.
  2. Pressman, Roger S. Ph.D (1982). Software Engineering - A Practitioner's Approach - Fourth Edition. ISBN 0-07-052182-4