Показником номер один погано поєднаних модулів, на мою думку, є двосторонні залежності. Наприклад, Module1 one викликає деяку функцію в Module2, а Module2 викликає деяку функцію в Module1.
Більшість інтерфейсів повинні бути односпрямованими. Якщо викликаний модуль повинен передати деяку інформацію модулю виклику, який не повертається як частина виклику, він повинен використовувати якийсь механізм передачі повідомлення або механізм ініціювання події, такий як черга повідомлень. В ідеалі інтерфейс обробки та передачі повідомлень повинен передаватися під час ініціалізації чи реєстрації. Це повністю абстрагує інтерфейс таким чином, що модуль насправді не хвилює, для кого подія ... отже, він роз'єднується.
Ще одна вказівка - коли один модуль постійно викликає якийсь інший модуль для певного набору даних. Це повинно змусити вас запитати, хто насправді повинен володіти набором даних. Чому саме цьому модулю, про який йдеться, завжди потрібно бачити дані, що належать до якогось іншого модуля?
Третій інструмент, так би мовити, - запитати себе: "Чи можу я витягнути цей модуль і замінити його, не вимагаючи змін до інших модулів.
Це аж ніяк не вичерпний список, але це три найкращі речі, про які я задаюсь питанням проектування програмного забезпечення.