теория
А теперь тоньше. Внутри каждого уровня силы есть второе измерение — степень: насколько сложное и неявное знание переносит связь. Мерить её удобно шкалой : два фрагмента кода «рождены вместе», если изменение одного заставляет менять другой.
Статическая connascence видна в коде и задаёт степени модельных и контрактных связей — по нарастанию неявности: общее имя → общий тип → общий смысл («статус 3 = отменён», попробуй догадайся) → общий алгоритм (обе стороны одинаково считают чексумму) → общая позиция (третий элемент кортежа — цена… или скидка?).
Динамическая connascence проявляется только в работе системы и задаёт степени функциональных связей: общий порядок (сначала резерв, потом списание) → общий тайминг (не позже тридцати секунд) → общее значение (два числа обязаны сойтись) → общая идентичность (два модуля работают с одним экземпляром данных).
Вчерашние Платежи — конасценция значения (connascence of value): «сумма списания равна итогу расчёта с точностью до копейки» — инвариант, связывающий данные двух модулей. Округление сдвинуло значение на одной стороне — инвариант лопнул.
Отсюда два следствия.
Асинхронность не ослабляет связь. Замени вызов очередью событий — по ней потечёт то же знание: чужая модель в теле события, тот же инвариант, тот же порядок. Транспорт меняет форму отказа, а не объём разделяемого знания.
Сильнейшая функциональная связь не оставляет следов. : одно правило реализовано в двух модулях. Ни вызова, ни события, ни общего типа — только обязанность меняться синхронно и ни одного канала, по которому пришло бы напоминание. Лекарство известно давно — : у каждого знания в системе должно быть единственное, непротиворечивое, авторитетное представление.
Как искать связи, которых не видно? Держи надёжную эвристику: не читай код — придумай изменение бизнес-требования и спроси, кого оно заденет. «Маркетинг меняет формулу скидки» — и Доставка поднимает руку, хотя на карте её нет.