Низька зв’язність, висока когерентність

Ключ до створення коду, який можна підтримувати, – це дотримання принципу «низька зв’язність, висока когерентність».

Але що саме це означає? В який момент ваш код є слабко зв’язаним і високо когерентним?

У цій статті ми говоримо про «модулі», які представляють майже будь-яку мовну конструкцію, яку ви маєте. В об’єктно-орієнтованих мовах це можуть бути класи. У JavaScript це можуть бути пакети або домени.

Слабкий зв’язок

Наскільки різні модулі залежать один від одного?

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

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

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

Висока згуртованість

Ми хочемо розробляти компоненти, які є самодостатніми: незалежними та з єдиною, чітко визначеною метою — “Прагматичний програміст”.

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

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

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

Компонента зв'язності графа — Вікіпедія

Код, який можна підтримувати

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

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

Хороший спосіб визначити, наскільки зв’язним і взаємопов’язаним є ваш код, ілюструє ця цитата з книги “Прагматичний програміст”:

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

Коли ви пишете і працюєте з кодовою базою, запитайте себе:

  • Скільки модулів я зачіпаю, щоб виправити це або створити цей функціонал?
  • У скількох різних місцях потрібно зробити цю зміну?
  • Наскільки складно протестувати мій код?
  • Чи можна це покращити, зробивши код менш зв’язаним? Чи можна це покращити, зробивши наш код більш зв’язним?

Висновок

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