Разница между сцеплением и сцеплением

В чем разница между сцеплением и сцеплением?

Как связь и сплоченность могут привести к хорошему или плохому дизайну программного обеспечения?

Какие примеры иллюстрируют разницу между ними и их влияние на общее качество кода?

18 ответов

Решение

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

Пример низкой когезии:

-------------------
| Staff           |
-------------------
| checkEmail()    |
| sendEmail()     |
| emailValidate() |
| PrintLetter()   |
-------------------

Пример высокой когезии:

----------------------------
| Staff                   |
----------------------------
| -salary                 |
| -emailAddr              |
----------------------------
| setSalary(newSalary)    |
| getSalary()             |
| setEmailAddr(newEmail)  |
| getEmailAddr()          |
----------------------------

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

Хороший программный дизайн имеет высокую когезию и низкую связь.

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

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

Глава 3 " Создание объектно-ориентированного программного обеспечения" Мейера (2-е издание) - отличное описание этих проблем.

Сплоченность является показателем того, насколько связаны и сфокусированы обязанности программного элемента.

Связывание означает, насколько сильно программный элемент связан с другими элементами.

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

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

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

  1. поддержка получения соединения
  2. освободить связь
  3. получить статистику о соединении в сравнении с использованием счетчика
  4. получить статистику о времени соединения
  5. Сохраните поиск соединения и отправьте информацию в базу данных для последующего отчета.

С низким сцеплением мы могли бы разработать ConnectionPool Класс путем принудительного объединения всех этих функций / обязанностей в один класс, как показано ниже. Мы видим, что этот единственный класс отвечает за управление соединением, взаимодействие с базой данных, а также за поддержание статистики соединения.

Бассейн с низкой когезией

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

Бассейн с высокой когезией

Чтобы продемонстрировать низкую связь, мы продолжим с высокой когезией ConnectionPool Диаграмма выше. Если мы посмотрим на приведенную выше диаграмму, хотя она поддерживает высокую степень сцепления, ConnectionPool тесно связан с ConnectionStatistics класс и PersistentStore он взаимодействует с ними напрямую. Вместо того, чтобы уменьшить сцепление, мы могли бы ввести ConnectionListener интерфейс и пусть эти два класса реализуют интерфейс и позволяют им зарегистрироваться с ConnectionPool учебный класс. И ConnectionPool будет проходить через этих слушателей и уведомлять их о событиях получения и освобождения соединения и позволит меньше связывать.

Соединение для низкого соединения

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

Сплоченность является показателем отношений внутри модуля.

Связь является показателем взаимосвязей между модулями.

введите описание изображения здесь

когезия

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

Связь

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

проверьте эту ссылку

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

По сути, высокая когезия означает хранение частей базы кода, которые связаны друг с другом, в одном месте. Слабое связывание, в то же время, сводится к тому, чтобы максимально разделить несвязанные части кодовой базы.

Типы кода с точки зрения сплоченности и связи:

Идеальным является код, который следует руководящим принципам. Это слабосвязанный и очень сплоченный. Мы можем проиллюстрировать такой код этой картинкой:

Объект Бога является результатом введения высокой сплоченности и высокой связи. Это анти-шаблон и в основном означает один кусок кода, который выполняет всю работу одновременно: плохо выбранный имеет место, когда границы между различными классами или модулями выбраны плохо

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

читать больше здесь

Увеличенная когезия и уменьшенная связь приводят к хорошему дизайну программного обеспечения.

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

Разъединение позволяет вам изменить реализацию, не затрагивая другие части вашего программного обеспечения.

Сплоченность гарантирует, что реализация более специфична для функциональности и в то же время проще в обслуживании.

Наиболее эффективным методом уменьшения сцепления и увеличения сцепления является проектирование по интерфейсу.

То есть основные функциональные объекты должны "знать" друг друга только через интерфейс (ы), который они реализуют. Реализация интерфейса представляет единство как естественное следствие.

Хотя это нереально в некоторых случаях, это должно быть целью разработки.

Пример (очень схематичный):

public interface IStackoverFlowQuestion
      void SetAnswered(IUserProfile user);
      void VoteUp(IUserProfile user);
      void VoteDown(IUserProfile user);
}

public class NormalQuestion implements IStackruQuestion {
      protected Integer vote_ = new Integer(0);
      protected IUserProfile user_ = null;
      protected IUserProfile answered_ = null;

      public void VoteUp(IUserProfile user) {
           vote_++;
           // code to ... add to user profile
      }

      public void VoteDown(IUserProfile user) {
          decrement and update profile
      }

      public SetAnswered(IUserProfile answer) {
           answered_ = answer
           // update u
      }
}

public class CommunityWikiQuestion implements IStackruQuestion {
     public void VoteUp(IUserProfile user) { // do not update profile }
     public void VoteDown(IUserProfile user) { // do not update profile }
     public void SetAnswered(IUserProfile user) { // do not update profile }
}

Где-то еще в вашей кодовой базе вы можете иметь модуль, который обрабатывает вопросы независимо от того, что они из себя представляют:

public class OtherModuleProcessor {
    public void Process(List<IStackruQuestion> questions) {
       ... process each question.
    }
}

Лучшее объяснение сплоченности исходит из чистого кода дяди Боба:

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

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

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

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

Связывание простыми словами - это то, сколько один компонент (опять же, представьте себе класс, хотя и не обязательно) знает о внутренних принципах работы или внутренних элементах другого, т. Е. Сколько он знает о другом компоненте.

Я написал сообщение в блоге об этом, если вы хотите прочитать чуть больше деталей с примерами и рисунками. Я думаю, что это отвечает на большинство ваших вопросов.

Сплоченность относится все о том, как разработан один класс. Сплоченность - это объектно-ориентированный принцип, наиболее тесно связанный с обеспечением того, чтобы класс был разработан с единственной, четко сфокусированной целью. Чем более сфокусирован класс, тем больше сплоченность этого класса. Преимущества высокой когезии состоят в том, что такие классы гораздо легче поддерживать (и реже менять), чем классы с низкой когезией. Еще одним преимуществом высокой сплоченности является то, что классы с четко определенной целью, как правило, более пригодны для повторного использования, чем другие классы.

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

Сплоченность (Co-hesion): Co, что означает вместе, hesion, что означает придерживаться. Система склеивания частиц разных веществ.

Для реального примера:

img Предоставлено

Целое больше, чем сумма частей - Аристотель.

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

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

Сплоченность является показателем относительной функциональной прочности модуля.

  • Сплоченный модуль выполняет единственную задачу, требующую небольшого взаимодействия с другими компонентами в других частях программы. Проще говоря, связный модуль должен (в идеале) делать только одну вещь.
  • View Традиционный вид:

    "целеустремленность" модуля

  • ViewOO вид:

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

  • E Уровни сплоченности

    Functional

    Layer

    Communicational

    Sequential

    Procedural

    Temporal

    utility

Связь является показателем относительной взаимозависимости между модулями.

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

  • Обычное представление: степень, в которой компонент связан с другими компонентами и с внешним миром

  • OO view: качественная мера степени, в которой классы связаны друг с другом

  • Уровень сцепления

    Content

    Common

    Control

    Stamp

    Data

    Call Обычный звонок

    Use Тип использования

    Or Включение или импорт

    Ternal Внешний #

Я думаю, что различия могут быть сформулированы следующим образом:

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

В этом посте я пишу об этом более подробно.

Термин сплоченность действительно немного противоречит тому, что он означает в разработке программного обеспечения.

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

Возможно, мы можем думать об этом таким образом. Часть имеет наибольшую сплоченность, когда она единственная (выполняет только одну функцию и не может быть разбита дальше). Это то, что желательно в разработке программного обеспечения. Сплоченность - это просто другое название "единой ответственности" или "разделения интересов".

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

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

Связь = взаимодействие / отношения между двумя модулями...Сплоченность = взаимодействие между двумя элементами внутри модуля.

Программное обеспечение состоит из множества модулей. Модуль состоит из элементов. Рассмотрим модуль как программу. Функция в программе - это элемент.

Во время выполнения вывод программы используется как ввод для другой программы. Это называется взаимодействием модуля с модулем или процессом обработки взаимодействия. Это также называется сцеплением.

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

Пример:

Связь = общение между двумя разными семьями... Сплоченность = общение между отцом, матерью и ребенком в семье.

Проще говоря, сплоченность означает, что класс должен представлять единую концепцию.

Открытый интерфейс класса является связным, если все функции класса связаны с концепцией, которую представляет класс. Например - вместо того, чтобы иметь класс CashRegister с функциями CashRegister и Coin, сплоченность делится на 2 класса - класс CashRegister и Coin

В соединении один класс зависит от другого, поскольку он использует объекты класса.

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

Обычно высокая когезия и низкая связь считается высоким качеством ООП

Теоретическая разница

Сплоченность

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

Классификация сплоченности

1. совпадение 2. логическое 3. временное 4. процедурное 5. связь 6. последовательное 7. функциональное

Связь

  • Связь - это показатель относительной взаимозависимости между модулями.
  • Степень связи между двумя модулями зависит от сложности их интерфейса.

Проще говоря,сплоченность — это «код, который меняется вместе, остается вместе». Соединение — это «изменение одного компонента требует изменения другого компонента».

Связность применяется к коду, находящемуся внутри границы, а связь применяется к коду, находящемуся за границей.

Система стабильна, если связь сильная, а связь низкая. Это мантра в мире микросервисов.

Различные типы сцепления: (от слабого до прочного)

  • Связывание доменов — один микросервис должен взаимодействовать (чтобы использовать функциональность) с другим микросервисом.
  • Сквозное соединение. Один микросервис передает данные другому микросервису исключительно для использования другим нижестоящим сервисом.
  • Общее соединение — 2 микросервиса используют общий набор данных (например, общую базу данных или кеш).
  • Content Coupling — восходящая служба меняет внутреннее состояние нисходящей службы.
Другие вопросы по тегам