Что такое высокая сплоченность и как ее использовать/сделать?

Я изучаю компьютерное программирование, и в нескольких местах я наткнулся на концепцию сплоченности, и я понимаю, что желательно, чтобы программное обеспечение обладало "высокой связностью", но что это значит? Я программист на Java, C и Python, изучающий С++ из книги С++ Primer, в которой упоминается сплоченность, не имея ее в индексе, не могли бы вы указать мне некоторые ссылки на эту тему? Я не нашел страницу wikipedia об информативности в области информатики, поскольку она просто говорит, что она является качественной мерой и не дает реальных примеров кода.

Ответ 1

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

Возьмем этот пример:

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

Чтобы создать высокое связующее решение, вам нужно создать класс Window и класс Sum. Окно вызовет метод Sum, чтобы получить результат и отобразить его. Таким образом, вы будете разрабатывать отдельно логику и графический интерфейс вашего приложения.

Ответ 2

Объяснение того, что из кода Стива Макконнелла завершено:

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

Какой-то способ добиться этого от дяди Боба Чистого кода:

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

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

Понятие сцепления сильно связано с понятием сцепления; также существует принцип, основанный на эвристике высокой сплоченности, названной принципом единой ответственности (S от SOLID).

Ответ 3

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

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

например. Класс электронной почты. Он должен содержать члены данных в, из, cc, bcc, subject, body и может содержать эти методы saveAsDraft(), send(), discardDraft(). Но login() не должен быть здесь, так как существует несколько протоколов электронной почты и должен быть реализован отдельно.

Ответ 4

Сплошность обычно измеряется с использованием одной из показателей LCOM (отсутствие сцепления), исходная метрика LCOM поступает из Chidamber и Kemerer. См. Например: http://www.computing.dcu.ie/~renaat/ca421/LCOM.html

Более конкретный пример: Если класс имеет, например, одно частное поле и три метода; когда все три метода используют это поле для выполнения операции, класс очень сложен.

Псевдокод целостного класса:

class FooBar {
  private SomeObject _bla = new SomeObject();

  public void FirstMethod() {
    _bla.FirstCall();
  }

  public void SecondMethod() {
    _bla.SecondCall();
  }

  public void ThirdMethod() {
    _bla.ThirdCall();
  }
}

Если класс имеет, например, три частных поля и три метода; когда все три метода используют только одно из трех полей, тогда класс плохо слажен.

Псевдокод плохо сцепленного класса:

class FooBar {
  private SomeObject _bla = new SomeObject();
  private SomeObject _foo = new SomeObject();
  private SomeObject _bar = new SomeObject();

  public void FirstMethod() {
    _bla.Call();
  }

  public void SecondMethod() {
    _foo.Call();
  }

  public void ThirdMethod() {
    _bar.Call();
  }
}

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

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

Ответ 5

Это пример низкой когезии:

class Calculator
{


     public static void main(String args[])
     {

          //calculating sum here
          result = a + b;
          //calculating difference here
          result = a - b;
          //same for multiplication and division
     }
}

Но высокая сплоченность подразумевает, что функции в классах выполняют то, что они должны делать (например, они называются). И не какая-то функция выполняет работу другой функции. Таким образом, может быть примером высокой степени сцепления:

class Calculator
{


     public static void main(String args[])
     {

          Calculator myObj = new Calculator();
          System.out.println(myObj.SumOfTwoNumbers(5,7));
      }


     public int SumOfTwoNumbers(int a, int b)
     {

          return (a+b);
     }

     //similarly for other operations

}

Ответ 6

cohesion означает, что класс или метод выполняет только одно задание. имя метода или класса также должно быть понятным. например, если вы пишете калькулятор, вы должны назвать класс "калькулятор", а не "asdfghj". также вы должны подумать о создании метода для каждой задачи, например. subtract() add() и т.д.... программист, который может использовать вашу программу в будущем, точно знает, что делают ваши методы. хорошее именование может уменьшить усилия комментирования.

также принцип DRY - не повторяйте себя

Ответ 7

Общий способ думать о принципе сплоченности состоит в том, что вы должны найти код вместе с другим кодом, который зависит от него или от которого он зависит. Сплоченность может и должна применяться к уровням композиции выше уровня класса. Например, пакет или пространство имен должны в идеале содержать классы, которые относятся к какой-то общей теме, и которые в большей степени зависят друг от друга, чем зависят от других пакетов/пространств имен. То есть сохраняйте зависимости локальными.

Ответ 8

статья MSDN, вероятно, более информативна, чем Википедия в этом случае.

Ответ 9

Термин "когезия" первоначально использовался для описания модулей исходного кода как качественного показателя того, насколько хорошо исходный код модуля был связан друг с другом. Идея сплочения используется в различных областях. Например, группа людей, таких как воинская часть, может быть сплоченной, что означает, что люди в подразделении работают вместе в направлении общей цели.

Сущность когерентности исходного кода заключается в том, что исходный код в модуле работает вместе в направлении общей, четко определенной цели. Минимальный объем исходного кода, необходимый для создания выходов модуля, находится в модуле и не более. Интерфейс хорошо определен, и входы проходят через интерфейс, а выходы возвращаются через интерфейс. Нет никаких побочных эффектов, и акцент делается на минимализме.

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

Модуль может быть классом в объектно-ориентированном языке или функцией на функциональном языке или не-объектно-ориентированном языке, таком как C. Большая часть первоначальной работы в этой области измерения сплоченности в основном связана с работой с программами COBOL в IBM еще в 1970-х годах такая сплоченность определенно не просто объектно-ориентированная концепция.

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

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

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

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

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

Например, функция, которая генерирует исключение или задает глобальную переменную ошибки (errno в C) или должна использоваться в последовательности (strtok() функция является примером из библиотеки Standard C, поскольку она поддерживает внутреннее состояние ) или который предоставляет указатель, который затем должен управляться, или выдает журнал для какой-либо утилиты журнала, являются примерами функции, которая больше не является функциональной связью.

Я прочитал оригинальную книгу Твордона и Константина "Структурированное программирование", в которой я впервые встретил идею сплочения в 1980-х годах и книгу "Мейлир Пейдж-Джонс" "Практическое руководство по проектированию структурированных систем", а "Стэн-Джонс" сделал намного лучше описание описания связи и сцепления. Книга Youdon и Constantine кажется немного более академичной. Стив Макконнелл, книга Code Complete, довольно хороша и практична, и в пересмотренном издании довольно много говорится о хорошей практике программирования.