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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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



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

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

Псевдокод связного класса:

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

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

Класс, делающий одно, принцип[Принцип единой ответственности](http://www.objectmentor.com/resources/articles/srp.pdf) который происходит от Роберта С. Мартина и является одним из[SOLID](https://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29) принципы. Принцип предписывает, чтобы у класса была только одна причина для изменения.

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



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

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



Объяснение того, что это, от Стива Макконнелла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 () и т.д ...
программист, который может использовать вашу программу в будущем, точно знает, что делают ваши методы. хорошее именование может уменьшить усилия комментирования

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



[MSDN & APOS; s](https://msdn.microsoft.com/en-us/magazine/cc947917.aspx) статья о нем, вероятно, более информативна, чем википедия в данном случае.



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