Тема дня №26 по программной инженерии

Примечание. Первоначально это было написано и опубликовано во внутреннем Slack Armakuni Томом Орамом.

Connascence — это метрика качества программного обеспечения и таксономия для различных типов связи. Мы можем использовать его для информирования наших решений о том, как и где уменьшить связанность в наших системах.

Сознание обладает тремя свойствами:

  • Сила
  • Местность
  • Уровень

Каждый тип коннасценции имеет разную силу, менее сильные вызывают меньше проблем. Локальность — это то, находятся ли связанные объекты рядом друг с другом (например, в одном классе или модуле) или далеко друг от друга (например, разные модули, библиотеки или службы). Степень - это то, как много вещей соединено вместе. Эти показатели следует рассматривать вместе; то есть что-то с высокой силой сцепления может быть неплохим, если оно очень локально и имеет низкую степень.

Существует две категории коннесценных типов: динамические и статические. Статические типы можно обнаружить, проверив код, динамические требуют знания среды выполнения. Типы, в порядке прочности от низкого к высокому:

Статический

  1. Имя — вещи связаны, если вы должны ссылаться на одно и то же имя (например, имя функции).
  2. Тип — вещи связаны, когда нужно согласовать тип
  3. Значение — вещи связаны, когда определенные значения имеют особое значение (например, ноль означает, что не найдено).
  4. Позиция — вещи связаны, когда позиция (в списке или наборе параметров) имеет особое значение.
  5. Алгоритм — вещи связаны, когда они оба должны понимать один и тот же алгоритм (например, функции шифрования и дешифрования).

Динамический

  1. Порядок выполнения — вещи связаны, когда ряд действий должен вызываться в определенном порядке.
  2. Время — вещи связаны, когда порядок имеет значение в соответствии со временем (например, условия гонки).
  3. Значение — вещи связаны, когда два или более значения зависят друг от друга.
  4. Идентификация — элементы объединяются, когда необходимо использовать конкретный экземпляр чего-либо.
  5. Ручная задача — вещи связываются, когда происходит ручное связывание вручную.

Connascence дает нам конкретную метрику для уменьшения связи в нашем коде. Когда вы определяете тип связи, вы можете подумать о том, как ее уменьшить (это особенно полезно, когда вы определяете динамические типы связи).

Дополнительные примеры см. на https://connascence.io/

Q1. Какие типы совпадения могут быть обнаружены компилятором в языках со статической типизацией?

Вопрос 2. Можете ли вы привести пример того, как перейти от одного типа сочувствия к другому?