На мой взгляд, индикатор номер один плохо связанных модулей - это двусторонние зависимости. Например, Module1 one вызывает некоторую функцию в Module2, а Module2 вызывает некоторую функцию в Module1.
Большинство интерфейсов должны быть однонаправленными. Если вызываемому модулю необходимо передать вызывающему модулю некоторую информацию, которая не возвращается как часть вызова, он должен использовать какой-либо механизм передачи сообщений или механизм запуска событий, такой как очередь сообщений. В идеале дескриптор интерфейса передачи сообщений должен передаваться во время некоторой инициализации или процесса регистрации. Это полностью абстрагирует интерфейс таким образом, что модулю на самом деле все равно, для кого это событие ... следовательно, он не связан.
Другое указание - когда один модуль постоянно вызывает какой-то другой модуль для определенного набора данных. Это должно заставить вас задаться вопросом, кто на самом деле должен владеть набором данных. Почему этот модуль всегда должен видеть данные, принадлежащие другому модулю?
Третий инструмент, так сказать, это спросить себя: «Могу ли я вынуть этот модуль и заменить его, не требуя изменений других модулей.
Это далеко не полный список, но это три главные вещи, которые я задаю себе при разработке программного обеспечения.