Найти в Дзене

Коннасценция: фундаментальный принцип построения архитектуры в коде

В мире программирования понимание тонкостей архитектуры кода имеет решающее значение для создания поддерживаемых и масштабируемых систем. Одним из концептов, который набирает популярность, является коннасценция. Введенная в начале 1990-х годов Мейлиром Пейдж-Джонсом, коннасценция предоставляет рамки для оценки архитектурных решений в объектно-ориентированном программировании. Эта статья направлена на разъяснение коннасценции, изучение её происхождения, форм, свойств и практического применения в архитектуре программного обеспечения. Концепт коннасценции был представлен Мейлиром Пейдж-Джонсом в его работе 1992 года "Сравнение техник с помощью инкапсуляции и коннасценции". Он более подробно развил эту идею в своих книгах "Что каждый программист должен знать об объектно-ориентированном дизайне" (1995) и "Основы объектно-ориентированного дизайна в UML" (1999). Коннасценция возникла в период, когда объектно-ориентированное программирование становилось доминирующим подходом, предлагая способ
Оглавление

Введение

В мире программирования понимание тонкостей архитектуры кода имеет решающее значение для создания поддерживаемых и масштабируемых систем. Одним из концептов, который набирает популярность, является коннасценция. Введенная в начале 1990-х годов Мейлиром Пейдж-Джонсом, коннасценция предоставляет рамки для оценки архитектурных решений в объектно-ориентированном программировании. Эта статья направлена на разъяснение коннасценции, изучение её происхождения, форм, свойств и практического применения в архитектуре программного обеспечения.

Происхождение коннасценции

Концепт коннасценции был представлен Мейлиром Пейдж-Джонсом в его работе 1992 года "Сравнение техник с помощью инкапсуляции и коннасценции". Он более подробно развил эту идею в своих книгах "Что каждый программист должен знать об объектно-ориентированном дизайне" (1995) и "Основы объектно-ориентированного дизайна в UML" (1999). Коннасценция возникла в период, когда объектно-ориентированное программирование становилось доминирующим подходом, предлагая способ оценки архитектурных решений за пределами традиционных метрик структурированного программирования, таких как выход, связывание и согласованность.

Джим Уирч вновь привлек внимание к коннасценции в начале 2000-х годов через серию лекций, улучшая её изложение и применимость. Недавно Кевин Ратерфорд исследовал коннасценцию как руководство для эффективного рефакторинга, предлагая её как более объективный инструмент, чем запахи кода, для выявления проблем дизайна.

Что такое коннасценция?

Коннасценция — это критерий для оценки архитектурных решений в объектно-ориентированном дизайне. Она затрагивает взаимозависимости между различными уровнями инкапсуляции, введенными объектно-ориентированным программированием, такими как классы, методы и атрибуты. Коннасценция может быть определена как:

Коннасценция между двумя элементами программного обеспечения A и B означает либо:Изменение A требует изменения (или проверки) B для сохранения общей корректности.
Изменение требует изменения и A, и B вместе для поддержания корректности.

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

Формы коннасценции

Коннасценция может быть классифицирована как статическая и динамическая:

-2

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

  1. Коннасценция имени (CoN): Несколько компонентов должны согласовывать название сущности.
  2. Коннасценция типа (CoT): Несколько компонентов должны согласовывать тип сущности.
  3. Коннасценция значения (CoM) или коннасценция конвенции (CoC): Несколько компонентов должны согласовывать значение определенных значений.
  4. Коннасценция позиции (CoP): Несколько компонентов должны согласовывать порядок значений.
  5. Коннасценция алгоритма (CoA): Несколько компонентов должны согласовывать конкретный алгоритм.

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

  1. Коннасценция выполнения (CoE): Важен порядок выполнения нескольких компонентов.
  2. Коннасценция времени (CoTm): Важно время выполнения нескольких компонентов.
  3. Коннасценция значения (CoV): Существуют ограничения на возможные значения некоторых общих элементов, часто связанные с инвариантами.
  4. Коннасценция идентичности (CoI): Несколько компонентов должны ссылаться на одну и ту же сущность.

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

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

Свойства коннасценции

Пейдж-Джонс выделяет два ключевых свойства коннасценции, влияющих на поддерживаемость:

  1. Степень явности: Чем более явна форма коннасценции, тем слабее она.
  2. Локальность: Коннасценция через границы инкапсуляции хуже, чем коннасценция между элементами в пределах одной границы инкапсуляции.

Эти свойства можно понять через три оси коннасценции:

  1. Степень: Размер воздействия коннасценции. Более высокая степень означает, что больше элементов затронуты.
  2. Локальность: Близость коннасцентных элементов. Близкие элементы обычно должны иметь более сильные формы коннасценции, чем удаленные элементы. Словами, по мере увеличения расстояния между элементами программного обеспечения, формы коннасценции должны быть слабее.
  3. Сила: Пейдж-Джонс утверждает, что коннасценция имеет спектр явности. Чем более неявна форма коннасценции, тем более времязатратным и дорогостоящим является её обнаружение. Также более сильная форма коннасценции обычно сложнее для рефакторинга. Следуя этой логике, статические формы коннасценции слабее (легче обнаружить) по сравнению с динамическими, или, например, CoN значительно слабее (легче рефакторить) по сравнению с CoP.

Коннасценция, принципы дизайна и рефакторинг

Коннасценция предлагает более простой взгляд на принципы дизайна, такие как SOLID и закон Деметры. Она предоставляет точный словарь для обсуждения связности и согласованности, помогая оценить дизайн в плане связности и согласованности и принять решения о его улучшении. По словам Кевина Ратерфорда, коннасценция может быть более подходящим метрикой, чем запахи кода, для руководства рефакторингом.

Коннасценция предоставляет классификацию форм связности в системе и, что ещё лучше, шкалу относительной силы связности, которую каждая форма коннасценции генерирует. Именно эта шкала относительной силы делает коннасценцию гораздо более надежным руководством для рефакторинга. Как говорит Кевин Ратерфорд:

"Поскольку она классифицирует относительную силу связности, коннасценция может быть использована как инструмент для приоритизации того, что следует рефакторить первым."
Коннасценция объясняет, почему выполнение определенного рефакторинга является разумным решением.

Как применять коннасценцию?

Пейдж-Джонс предлагает три рекомендации по использованию коннасценции для повышения поддерживаемости систем:

  1. Минимизировать общую коннасценцию: Разделить систему на инкапсулированные элементы.
  2. Минимизировать оставшуюся коннасценцию, пересекающую границы инкапсуляции.
  3. Максимизировать коннасценцию внутри границ инкапсуляции.

Согласно Кевину Ратерфорду, первые два пункта соответствуют алгоритму рефакторинга Пейдж-Джонса.

Эти рекомендации обобщают идеалы структурированного дизайна низкой связности и высокой согласованности и применимы к объектно-ориентированному программированию или, как было сказано ранее, к любому другому парадигме с разделением, инкапсуляцией и правилами видимости.

Они могут быть ещё немного субъективными, поэтому некоторые предпочитают более конкретный способ применения коннасценции, используя принципы или правила Джима Уирча:

  1. Правило степени: Преобразовать сильные формы коннасценции в слабые.
  2. Правило локальности: По мере увеличения расстояния между элементами программного обеспечения использовать слабые формы коннасценции.

Заключение

Коннасценция — это фундаментальный принцип в архитектуре программного обеспечения, предоставляющий рамки для оценки и улучшения архитектурных решений. Понимая её формы, свойства и применение, разработчики могут создавать более поддерживаемые и масштабируемые системы. По мере развития ландшафта разработки программного обеспечения коннасценция остаётся ценным инструментом для руководства архитектурными решениями и усилиями по рефакторингу.

Давай заключим сделку, я продолжаю писать - ты подписываешься на мою телегу https://t.me/timofey_yakunin. Win-Win подход.

Вдохновением стала эта англоязычная статья:

About Connascence

Хорошо дополняют: