Термін згуртованість спочатку використовувався для опису модулів вихідного коду як якісного показника того, наскільки добре вихідний код модуля був пов'язаний між собою. Ідея згуртованості використовується в різних сферах. Наприклад, група людей, таких як військова частина, може бути згуртованою, тобто люди в підрозділі працюють разом задля досягнення спільної мети.
Суть згуртованості вихідного коду полягає в тому, що вихідний код модуля працює разом для досягнення спільної, чітко визначеної мети. Мінімальна кількість вихідного коду, необхідна для створення вихідних даних модуля, знаходиться в модулі і не більше. Інтерфейс чітко визначений, і входи надходять через інтерфейс, а виходи повертаються назад через інтерфейс. Побічних ефектів немає, і акцент робиться на мінімалізмі.
Перевага функціонально згуртованих модулів полягає в тому, що розробка та автоматизація модульних тестів є простою. Насправді хорошим показником згуртованості модуля є те, наскільки легко створити повний набір вичерпних модульних тестів для модуля.
Модулем може бути клас на об'єктно-орієнтованій мові або функція на функціональній мові або необ'єктно-орієнтованій мові, такі як C. Більша частина оригінальної роботи в цій галузі вимірювання згуртованості, в основному, включає роботу з програмами COBOL в IBM ще в 1970-х, тому згуртованість - це, безумовно, не просто об’єктно-орієнтована концепція.
Первинним наміром дослідження, з якого виникла концепція згуртованості та пов’язана з ним концепція взаємозв’язку, було дослідження того, де особливості програм, які було легко зрозуміти, підтримувати та розширювати. Метою було мати можливість вивчити найкращі практики програмування, кодифікувати ці найкращі практики, а потім навчити практик інших програмістів.
Метою хороших програмістів є написання вихідного коду, згуртованість якого є якомога більшою, враховуючи середовище та проблему, що вирішується. Це означає, що у великій програмі деякі частини тіла вихідного коду будуть відрізнятися від інших частин за рівнем згуртованості вихідного коду в цьому модулі або класі. Деколи найкраще, що ви можете отримати, це тимчасова або послідовна згуртованість через проблему, яку ви намагаєтесь вирішити.
Найкращий рівень згуртованості - це функціональна згуртованість. Модуль з функціональною когезією подібний до математичної функції тим, що ви надаєте набір входів і отримуєте конкретний результат. Справді функціональний модуль не матиме побічних ефектів на додаток до вихідних даних і не буде підтримувати будь-якого стану. Натомість він матиме чітко визначений інтерфейс, який інкапсулює функціональність модуля, не викриваючи жодного з внутрішніх елементів модуля, а особа, що використовує модуль, надасть певний набір входів і отримає натомість певний результат. Справді функціональний модуль також повинен бути безпечним для потоків.
Багато бібліотек мови програмування містять ряд прикладів функціональних модулів, будь то класи, шаблони чи функції. Найбільш функціональними згуртованими прикладами можуть бути математичні функції, такі як гріх, косинус, квадратний корінь тощо.
Інші функції можуть мати побічні ефекти або підтримувати якийсь стан, що призводить до ускладнення використання цих функцій.
Наприклад, функція, яка видає виняток або встановлює глобальну змінну помилки ( errno
в C), або її потрібно використовувати в послідовності ( strtok()
функція є прикладом із стандартної бібліотеки C, оскільки вона підтримує внутрішній стан), або яка надає покажчик, який повинен потім керуватися або видавати журнал до якоїсь утиліти журналу - це все приклади функції, яка більше не є функціональною цілісністю.
Я прочитав оригінальну книгу Вайдона та Костянтина "Структурне програмування", де вперше зіткнувся з ідеєю згуртованості у 1980-х і книгою Мейлір Пейдж-Джонс "Практичний посібник з проектування структурованих систем", і Пейдж-Джонс набагато краще описав як зчеплення, так і згуртованість. Книга Вайдона та Костянтина видається дещо більш академічною. Книга Стіва Макконнелла "Code Complete" є досить хорошою і практичною, і в переглянутому виданні можна сказати чимало про добру практику програмування.