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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Бассейн с низкой связью

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

    Бассейн с высокой степенью сцепления

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

    Низкое соединение соединения

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

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

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

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

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

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

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

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

    Пример (очень отрывочный):

     public interface IStackoverFlowQuestion void SetAnswered(IUserProfile user); void VoteUp(IUserProfile user); void VoteDown(IUserProfile user); } public class NormalQuestion implements IStackoverflowQuestion { 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 IStackoverflowQuestion { 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 questions) { ... process each question. } } 

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

    Связывание – это указание отношений между модулями.

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

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

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

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

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

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

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

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

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

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

    Для примера в реальной жизни:
    введите описание изображения здесь
    img Предоставлено

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

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

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

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

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

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

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

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

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

    • OO вид:

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

    • Блаки сплоченности

      Functional

      Layer

      Communicational

      Sequential

      Procedural

      Temporal

      utility

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

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

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

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

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

      Content

      Common

      Control

      Stamp

      Data

      Войти вызов

      Применение типа

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

      Внешний #

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

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

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

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

    Пример:

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

    Interesting Posts

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

    Как не потерять Wi-Fi после перехода в режим ожидания?

    Как изменить имя автора и коммиттера и e-mail нескольких коммитов в Git?

    Как работает модуль Divison

    Макет деятельности: class fragmentа: vs android: атрибуты name

    Как сохранить визуализаторы Visual Studio отладчика от тайм-аута?

    Включить и отключить автоматическое rotation программно?

    Сколько памяти использует строка в Java 8?

    Идентификатор канонической регистрации и формат идентификатора сообщения

    Является ли массив примитивов Java хранимым в стеке или куче?

    друг И встроенный метод, в чем смысл?

    Получать аудио через Bluetooth в Android

    Как сохранить групповые ресурсы на Samba с помощью клиентов OSX?

    Получение * buntu 17.04 (или других) для соблюдения моих предпочтений при установке на внешний диск UEFI / secureboot system

    Отключить плагин Maven, определенный в родительском POM

    Давайте будем гением компьютера.