В компьютерном программировании связность относится к степени, в которой элементы внутри модуля принадлежат друг другу . [1] В одном смысле это мера прочности связи между методами и данными класса и некоторой объединяющей целью или концепцией, которой служит этот класс. В другом смысле это мера прочности связи между методами и данными класса.
Сплоченность — это порядковый тип измерения, который обычно описывается как «высокая сплоченность» или «низкая сплоченность». Модули с высокой сплоченностью, как правило, предпочтительнее, поскольку высокая сплоченность связана с несколькими желательными характеристиками программного обеспечения, включая надежность , производительность, возможность повторного использования и понятность. Напротив, низкая сплоченность связана с нежелательными характеристиками, такими как сложность обслуживания, тестирования, повторного использования или понимания.
Сплочённость часто противопоставляется связанности . Высокая связанность часто коррелирует со слабой связанностью , и наоборот. [2] Программные метрики связанности и связанности были изобретены Ларри Константином в конце 1960-х годов как часть структурного проектирования , основанного на характеристиках «хороших» практик программирования, которые снижали затраты на обслуживание и модификацию. Структурное проектирование, связанность и связанность были опубликованы в статье Стивенса, Майерса и Константина (1974) [3] и книге Йордона и Константина (1979). [1] Последние два впоследствии стали стандартными терминами в программной инженерии .
В объектно-ориентированном программировании класс считается имеющим высокую степень связности, если методы, обслуживающие класс, во многих отношениях схожи. [4] В высокосвязной системе повышается читаемость кода и возможность его повторного использования , а сложность остается управляемой.
Сплоченность увеличивается, если:
Преимущества высокой сплоченности (или «сильной сплоченности»):
Хотя в принципе модуль может иметь идеальную связность, состоя из одного атомарного элемента, например, имеющего одну функцию, на практике сложные задачи не могут быть выражены одним простым элементом. Таким образом, модуль с одним элементом имеет элемент, который либо слишком сложен для выполнения задачи, либо слишком узок и, таким образом, тесно связан с другими модулями. Таким образом, связность уравновешивается как сложностью единицы, так и связностью.
Сплоченность — это качественная мера, означающая, что исходный код проверяется с использованием рубрики для определения классификации. Типы сплоченности, от худшего к лучшему, следующие:
/* Группы: Определения функций Части: Термины каждой функции */ Модуль A { /* Реализация r(x) = 5x + 3 Нет особой причины группировать функции таким образом, поэтому говорят, что модуль имеет Совпадающую связность. */ r ( x ) = a ( x ) + b ( x ) a ( x ) = 2 x + 1 b ( x ) = 3 x + 2 }
/* Группы: Определения функций Части: Термины каждой функции */ Модуль A { /* Реализация арифметических операций Этот модуль считается имеющим функциональную связность, поскольку в нем предполагается сгруппировать простые арифметические операции . */ a ( x , y ) = x + y b ( x , y ) = x * y } Модуль B { /* Модуль B: реализует r(x) = 5x + 3 Можно сказать, что этот модуль имеет атомарную связность. Можно также сказать, что вся система (с модулями A и B в качестве частей) имеет функциональную связность, поскольку обе ее части имеют определенные отдельные цели. */ r ( x ) = [ Module A ]. a ([ Module A ]. b ( 5 , x ), 3 ) }
/* Группы: Определения функций Части: Термины каждой функции */ Модуль A { /* Реализация r(x) = 2x + 1 + 3x + 2 Говорят, что она имеет совершенную связность, потому что ее нельзя уменьшить больше, чем на это. */ r ( x ) = 2 x + 1 + 3 x + 2 }
Хотя сплоченность является ранжирующим типом шкалы, ранги не указывают на устойчивую прогрессию улучшенной сплоченности. Исследования Ларри Константина , Эдварда Йордона и Стива Макконнелла [5] показывают, что первые два типа сплоченности являются низшими, коммуникационная и последовательная сплоченность очень хороши, а функциональная сплоченность является высшей.