Разве слабая связь и высокая когезия не зависят друг от друга?

Я должен написать две версии одного и того же кода. Один с низким сцеплением и высокой когезией, а другой - с низким сцеплением, но на этот раз с низкой когезией. Я не очень понимаю, в чем разница? Как я могу иметь низкую связь и низкую когезию? Они кажутся настолько связанными, что это невозможно сделать.

Может кто-нибудь объяснить это? Возможно с примером? Спасибо!

7 ответов

Решение

Короче:

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

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

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

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

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

В длинных:

Я написал в блоге об этом. В нем все подробно обсуждается, с примерами и т. Д. Также объясняются преимущества того, почему вы должны следовать этим принципам. Я думаю, что это может помочь...

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

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

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

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


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

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

Сплоченность и сцепление - это свойства вашей организации.

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

  1. бейсбол, бильярдный кий
  2. мяч для лакросса, теннисная ракетка
  3. бильярдный шар, крикетная бита
  4. теннисный мяч, бейсбольная бита
  5. мяч для крокета, палочка для лакросса
  6. крикет мяч, крокет молоток

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

Очевидная организация объектов в мешки

  1. бейсбол, бейсбольная бита
  2. теннисный мяч, теннисная ракетка
  3. крикет мяч, крикет летучей мыши
  4. крокетный мяч, крокетный молоток
  5. мяч для лакросса, палочка для лакросса
  6. бильярдный шар, бильярдный кий

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

Связь и сплоченность - это две близкие концепции, но они не одно и то же. Ваш дизайн должен иметь:

  1. Низкая связь: это означает, что ваши классы не должны слишком сильно зависеть от других классов (особенно конкретных классов). Вы должны отделить их как можно больше. Разъединение помогает многократному использованию (цель разработки программного обеспечения OO). Потому что, когда вы повторно используете такие классы, вам не нужно брать с собой какой-либо другой класс, чтобы он работал. Многие шаблоны дизайна, такие как Facade выполнить эту цель.

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

В продолжение я привожу 3 примера класса, которые могут иметь больше смысла:

#include <Document>
#include <Printer>
#include <SpellCheker>
class HighCoupling{
    // This class need other class to be usable
    Document *doc;
    Printer *activePrinter;
    CretaeDocument() { /*...*/ }
    SaveDocument() { /*...*/ }
    PrintDocument() { /*...*/ }    
    CheckSpell() { /*...*/ }    
};

#include <Document>
class LowCouplingHighCohesion {
    // This class don't need other classes
    // This class is a specialist on some task
    CretaeDocument() { /*...*/ }
    SaveDocument(Format *) { /*...*/ }
    LoadDocument() { /*...*/ }
};

#include <Document>
class LowCouplingLowCohesion {
    // This class don't need other classes
    // This class do many unrelated things
    CretaeDocument() { /*...*/ }
    SaveDocument() { /*...*/ }
    OpenDocument() { /*...*/ }
    Undo() { /*...*/ }
    ChangeDocumentBackground()  { /*...*/ }
    SearchInDocument() { /*...*/ }
};

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

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

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

Разница в смысле.

  1. Сцепление относится к чему-то, что имеет отрицательное значение. Итак, согласно правилам SOLID, вы должны попытаться построить свое приложение таким образом, чтобы оно было слабосвязанным. Например, шаблоны Gof (например, Abstract Factory) и контейнеры DI (такие как MS Unity или NInject в мире.NET) могут помочь вам в этом. Слабосвязанный код означает, что если вам нужно вставить новый класс в ваше приложение (или, скажем так - если вам нужно сменить один класс на другой), то вы можете сделать это легко без больших усилий.

  2. Сплоченность относится к чему-то, что имеет положительное значение. Итак, как вы, наверное, догадались, вы должны попытаться построить свое приложение таким образом, чтобы оно реализовывало High Cohesion. Что это значит? Это относится к взаимодействию между различными модулями вашего приложения. Например, давайте предположим, что ваше приложение имеет два модуля:

    • Модуль экспорта - экспортирует некоторые данные в файл XML
    • Модуль импорта - импортирует некоторые данные из файла XML

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

Они обратно одинаковы, низкая связь = высокая когезия.

Другие вопросы по тегам