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

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

 Teoman shipahi16 дек. 2015 г., 17:15
Высокая сплоченность: связанное поведение, чтобы сидеть вместе, и несвязанное поведение, чтобы сидеть в другом месте.
 pablochan31 мая 2012 г., 10:43

Ответы на вопрос(9)

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

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

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

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

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

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

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

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

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

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

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

 08 июн. 2015 г., 05:30
Ты говоришьThe minimum amount of source code needed to create the module outputs is in the module and no more это связано не с единством, а сDTSTTCPW
 08 июн. 2015 г., 14:38
@ v.oddou, минимальный объем кода действительно связан с Cohesion. Чем больше кода в модуле, который не связан с модулем, выводит, тем больше вероятность того, что код имеет побочные эффекты, следовательно, более низкую сплоченность. Каждая концепция имеет разные точки зрения, особенно такие понятия, как сплоченность, которые несколько неоднозначны. Измерения для сплоченности являются качественными, требующими некой нечеткой логики для распределения определенного модуля в той или иной категории с использованием некоторой рубрики. Сказать минимальный код для выходов не является достаточной характеристикой для высокой когезии, только один из нескольких.

Связность обычно измеряется с использованием одной из метрик LCOM (отсутствие когезии), исходная метрика LCOM была получена от Чидамбера и Кемерера. Смотрите, например: 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 принципы. Принцип предписывает, чтобы у класса была только одна причина для изменения.

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

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

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

}

Объяснение того, что это, от Стива МакконнеллаCode Complete:

Cohesion refers to how closely all the routines in a class or all the code in a routine support a central purpose. Classes that contain strongly related functionality are described as having strong cohesion, and the heuristic goal is to make cohesion as strong as possible. Cohesion is a useful tool for managing complexity because the more code in a class supports a central purpose, the more easily your brain can remember everything the code does.

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

Classes should have a small number of instance variables. Each of the methods of a class should manipulate one or more of those variables. In general the more variables a method manipulates the more cohesive that method is to its class. A class in which each variable is used by each method is maximally cohesive.

In general it is neither advisable nor possible to create such maximally cohesive classes; on the other hand, we would like cohesion to be high. When cohesion is high, it means that the methods and variables of the class are co-dependent and hang together as a logical whole.

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

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

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

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

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

также принцип СУХОЙ - не повторяйся

Решение Вопроса

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

Давайте возьмем этот пример:

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

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

 10 янв. 2019 г., 07:14
Очень аккуратное объяснение! Спасибо
 08 июн. 2015 г., 05:23
Честно говоря, я не определяю сплоченность таким образом. Ваше определение - SRP (принцип единой ответственности). И сплоченность заключается в том, близки ли друг к другу классы с одинаковыми характеристиками или нет.
 15 нояб. 2017 г., 16:42
Я не понимаю. Это не сплоченность согласно чистому коду от дяди Боба. Это SRP
 13 окт. 2016 г., 22:40
SRP (принцип единой ответственности) - это просто еще один способ выразить ту же концепцию. Сплоченность - это скорее показатель; SRP - это практическое руководство, которое, если его соблюдать, приведет к сплоченным занятиям.
 12 июл. 2017 г., 06:38
Я думаю, что окно класса не должно вызывать какой-либо объект класса sum, поскольку его единственная цель - сделать так, чтобы ему не нужно было знать о «существовании». класса sum или любого другого класса. Должен быть другой класс, скажем, Driver, который должен получить результат из класса sum и передать результат в класс Window для визуализации.

MSDN & APOS; s статья о нем, вероятно, более информативна, чем википедия в данном случае.

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

Ваш ответ на вопрос