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