it-roy-ru.com

что такое слабая связь и сильная связь в oop (Java)

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

например: 

1) A (интерфейс) <--------------------- B (класс)

2) C (класс) <--------------------- D (класс)

предположим, что эти четыре класса являются частью всего моего приложения, внесение изменений в B или D не оказывает никакого влияния на приложение (с точки зрения выполнения). удаление любого метода или переменных из A или C потребовало так много изменений в приложении. все правильно счет 2-2, но добавление нового метода в C или A отличается. Если я добавил новый метод в C, это не повлияет на приложение, но при добавлении в A, по крайней мере, мне придется переопределить этот метод в B и всех классах, которые реализуют интерфейс A. Так как это слабая связь по крайней мере в этом сценарии ..__ , Я сомневаюсь, что наследование дает всегда тесную связь. Я узнал, что Наследование является одним из мощных инструментов ООП. Для проектирования, если класс следует «отношениям», используйте наследование слабая связь означает меньше информации друг о друге. A и C оба не знают в будущем, какой класс будет реализовывать или расширять, но после добавления B и D теперь B не зависит от A, потому что все его методы являются абстрактными, но D также может переопределить свойство наследования. 

6
vikas singh

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

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

Базовые примеры включают классы «адаптера» в колебании, которые предоставляют «неоперативные» реализации всех методов в интерфейсе. Более продвинутые примеры фактически обеспечивают стандартные реализации некоторых требований интерфейса.

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

2
Tim B

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

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

Допустим, 2 класса А и В должны общаться друг с другом.

 A <--knows--> B

Методы в A будут иметь некоторый параметр B, а методы в B имеют параметр типа A. Например. лайк

 class A {
     public void talkTo(B b) {}
 }    

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

Если вы делаете это свободно, они оба выставляют себя через некоторый интерфейс. («Интерфейс» также может означать абстрактный класс - это выбор соответствующей стороны.)

   IA  <-- A
     ^     |
      \   /
        X           < loose coupling between the A side and the B side
      /   \
     v     |
   IB  <-- B     < pretty tight coupling betwen IB and B

и связь между ними идет через эти интерфейсы

   class A implements IA {
        public void talkTo(IB b);
   }
   class B implements IB {
        public void talkTo(IA a);
   }

Зависимость между A и IA (это то, на что вы, похоже, смотрите) - это не то, что в первую очередь представляет собой тесная связь со слабой связью. Есть некоторое сходство, но слабая связь не означает, что вы должны реализовать интерфейс, а не расширять абстрактный класс. Обычно лучше реализовать только интерфейс.

Если вы можете заменить отношение «IS A» отношением «HAS A», вы делаете по сути то же самое. Вы отделяете себя (например, являетесь A) от конкретной реализации и должны зависеть только от инкапсулированной другой стороны (например, от стороны B). Наследование действительно очень мощная функция, но она часто используется неправильно.

16
zapl

Краткое введение Слабая и прочная муфта

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

Тесная связь

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

3
Sayat Satybald

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

0
Prashant Kumar