Конасценция (Connascence)

#OOP #OOD

Конасценция между двумя компонентами программного обеспечения А и Б подразумевает:

  1. что если вы вносите изменения в А, то Б тоже потребует внесения изменений, или как минимум проверки работоспособности и корректности.
  2. что можно представить требование, требующие одновременного внесение изменений в А и в Б для соблюдения корректности.

Статическая конасценция

Конасценция которая вносится при написании кода, компиляции и тд. Ее можно отследить в редакторе, специальными инструментами или глазами. Относится к классу

  1. Имени. Зависимость от имени. Например подкласс использует переменную родительского класса, если в родительском изменить имя переменной, то и в дочернем тоже придется изменить.
  2. Типа или класса. Зависимость от типа. Пример аналогичный с именем, только тут изменение типа. Второй пример это переименование класса, все кто использует этот класс должны получить изменение.
  3. Смысла. Например если имеется целочисленная переменная в которой отрицательные числа подразумевают корпорации, а начиная с нуля внутренние отделы, то при изменении этого смысла потребуется изменение везде где это используется.
  4. Алгоритма. Например два места работают с Хэш таблицей, один добавляет, другой извлекает запись. Оба зависят от алгоритма хеширования ключа.
  5. Позиции или последовательности. Например одна строка кода должна быть выполнена до выполнения второй строки кода итд.

Динамическая конасценция

Относится к времени выполнения, то есть скорее к объекту нежели к классу.

  1. Выполнения. Аналогично позиции в статической конасценции, только относится к динамике. Например инициализация переменной, до ее использования, чтение и изменение значения в глобальной переменной с использованием семафора итд.
  2. Времени. Подразумевает зависимость от реального времени в системах реального времени. Например инструкция выключения рентгеновского аппарата, должна быть выполнена в течении n миллисекунд после инструкции включения.
  3. Значения. Например изменение одного значения, требует изменения другого значения. Репликация данных между базами итд.
  4. Идентификации. Относится к связям в объектных моделях. Например если отчет по продажам ссылается на мартовскую сводную таблицу, тогда операционный отчет тоже должен указывать на мартовскую сводную таблицу. То есть если если два объекта o1 и о2 имеют ссылки на o3, то они всегда должны иметь одинаковую ссылку на o3. (Идентификация потому, что подразумевается указатель (идентификатор) на объект)

Контранасценция

Тут автор подразумевает зависимость в том, что вещи независимы. Например в коде используется два класса с именами А и Б. Эти классы между собой не связаны, однако если вы заходите переименовать А в Б, то сначала придется переименовать Б во, что-то другое. Тоже самое с переменными в одном методе. Если используется две переменные.