Connascence ( / k ə ˈ n eɪ s ən s / ) — это метрика качества программного обеспечения, изобретенная Мейлиром Пейдж-Джонсом, чтобы позволить рассуждать о сложности, вызванной отношениями зависимости в объектно-ориентированном проектировании , во многом подобно тому, как сцепление сделало для структурного проектирования . В программной инженерии два компонента являются connascence, если изменение в одном из них потребует изменения другого для поддержания общей корректности системы. В дополнение к возможности категоризации отношений зависимости, connascence предоставляет систему для сравнения различных типов зависимости. Такие сравнения между потенциальными проектами могут подсказать способы улучшения качества программного обеспечения.
Форма коннасценции считается более сильной, если она с большей вероятностью потребует компенсирующих изменений в коннасцентных элементах. Чем сильнее форма коннасценции, тем сложнее и дороже изменить элементы в отношениях.
Приемлемость connascence связана со степенью ее возникновения. Connascence может быть приемлемой в ограниченной степени, но неприемлемой в большой степени. Например, функция или метод, принимающие два аргумента, обычно считаются приемлемыми. Однако обычно неприемлемо, чтобы функции или методы принимали десять аргументов. Элементы с высокой степенью connascence влекут за собой большую сложность и стоимость изменения, чем элементы с более низкой степенью.
Локальность имеет значение при анализе connascence. Более сильные формы connascence приемлемы, если вовлеченные элементы тесно связаны. Например, многие языки используют позиционные аргументы при вызове функций или методов. Такая connascence позиции приемлема из-за близости вызывающего и вызываемого. Передача аргументов веб- службе позиционно неприемлема из-за относительной несвязанности сторон. Одинаковая сила и степень connascence будут иметь большую сложность и стоимость изменения, чем дальше находятся вовлеченные элементы.
Ниже представлен список некоторых типов согласия, упорядоченных приблизительно от слабых форм к сильным.
Коннасценсы считаются «статичными», если их можно обнаружить путем визуального исследования кода.
Согласованность имени — это когда несколько компонентов должны согласовать имя сущности. Имена методов являются примером этой формы согласованности: если имя метода изменяется, вызывающие этот метод должны быть изменены для использования нового имени.
Согласованность типа — это когда несколько компонентов должны согласовать тип сущности. В статически типизированных языках тип аргументов метода является примером этой формы согласованности. Если метод изменяет тип своего аргумента с целого числа на строку, вызывающие этот метод должны быть изменены для передачи аргумента, отличного от предыдущего.
Согласованность значений — это когда несколько компонентов должны согласовывать значение конкретных значений. Возврат целых чисел 0 и 1 для представления false и true соответственно является примером этой формы согласованности.
Согласованность позиции — это когда несколько компонентов должны согласовать порядок значений. Позиционные параметры в вызовах методов являются примером этой формы согласованности. И вызывающий, и вызываемый должны согласовать семантику первого, второго и т. д. параметров.
Согласованность алгоритма — это когда несколько компонентов должны согласовать определенный алгоритм. Коды аутентификации сообщений являются примером этой формы согласованности. Обе стороны обмена должны реализовать абсолютно одинаковый алгоритм хеширования, иначе аутентификация не будет выполнена.
Коннасценсы называются «динамическими», если их можно обнаружить только во время выполнения.
Совместность выполнения имеет место, когда важен порядок выполнения нескольких компонентов.
Согласованность сроков имеет место, когда важны сроки выполнения нескольких компонентов.
Коннасценция ценностей — это когда несколько ценностей должны изменяться одновременно.
Совпадение идентичности имеет место, когда несколько компонентов должны ссылаться на одну и ту же сущность.
Уменьшение connascence снизит стоимость изменений для программной системы. Один из способов уменьшения connascence — преобразование сильных форм connascence в более слабые формы. Например, метод, который принимает несколько аргументов, можно изменить так, чтобы он использовал именованные параметры . Это изменит connascence с CoP на CoN. Уменьшение степени и увеличение локальности задействованных элементов представляют собой другие способы уменьшения connascence.