Работа с круговой зависимостью

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


person tropicana    schedule 30.03.2011    source источник
comment
Что не так с круговыми ссылками в первую очередь? Зачем вам их ломать? Может быть, вам стоит указать на это в своем вопросе.   -  person Mecki    schedule 30.03.2011
comment
ну, я не знаю ... предположим, это антипаттерн, которого я хочу избежать! и в образовательных целях, чтобы проверить различные возможности дизайна.!   -  person tropicana    schedule 30.03.2011
comment
Циркулярные ссылки - это антипаттерн? Кто говорит? У Java GC нет проблем с ними для экземпляров (только GC, который использует чистый подсчет ссылок, будет иметь такую ​​проблему), и у компилятора нет проблем с ними во время компиляции, кроме того, что вы должны компилировать оба класса одновременно, поэтому компилятор может разрешить зависимости. Кстати, вы пропустили важный тег: java. Я тебе теги поправлю.   -  person Mecki    schedule 31.03.2011
comment
@Mecki: Круговые зависимости классов - это другое дело, чем циклы в графе объектов во время выполнения. Я согласен с тем, что следует избегать циклических зависимостей классов, где это возможно, и использование интерфейсов для разрыва зависимости - хороший подход.   -  person andersoj    schedule 31.03.2011
comment
@Chris: Если вы дадите нам пример ваших циклических зависимых классов, мы сможем дать лучший совет.   -  person Paŭlo Ebermann    schedule 31.03.2011
comment
Связанный stackoverflow.com/questions/4992860/   -  person andersoj    schedule 31.03.2011
comment
Возможный обман stackoverflow.com/questions/4007451/   -  person andersoj    schedule 31.03.2011
comment
Некоторое время назад я написал об этом статью: blog.schauderhaft.de / 2011/07/17 / break-dependency-cylces   -  person Jens Schauder    schedule 30.12.2012


Ответы (3)


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

Как предлагает Findbugs, используйте интерфейсы для разрыва круговой зависимости. То есть ввести интерфейс хотя бы для одного типа круга и заставить другие классы использовать интерфейс повсюду. Вам нужен пример кода?

person jmg    schedule 03.04.2011
comment
+1. Хорошие методики проектирования хороши тем, что имеют явную выгоду. В конкретных обстоятельствах коллекции и ее (ленивого) итератора, например, введение нового интерфейса просто для прерывания цикла является излишним. Однако я бы поспорил: используйте круговые зависимости только в тех случаях, когда вы можете включить все зависимости, кроме одной, как внутренние или вложенные классы. Фактически, используя внутренние классы таким образом, вы можете избежать множества предупреждений о циклических зависимостях, используя неявную ссылку на контейнер, которую хранит внутренний класс. - person Mark McKenna; 05.10.2011
comment
Используя неявную ссылку на внутренние классы, вы можете избежать предупреждения об инструментах, но ваш код по-прежнему имеет циклические ссылки. Но, как я уже сказал, я бы посоветовал делать круги как можно меньше - не избегать их любой ценой. И вы это делаете с помощью внутренних классов. - person jmg; 06.10.2011

Предложите прочитать о принципе инверсии зависимостей, например Что такое принцип инверсии зависимостей и почему он важно? или http://en.wikipedia.org/wiki/Dependency_inversion_principle

person andersoj    schedule 31.03.2011
comment
Вероятно, из-за отсутствия контекста вокруг ваших связанных URL-адресов. Рекомендуется читать URL-адреса, но ответ должен содержать некоторый контекст и суть URL-адресов. См. Это: stackoverflow.com/help/how-to-answer (укажите контекст для ссылок) - person sceiler; 19.05.2016

В блоге есть сообщение здесь о том, как Restructure101 использовался для удаления циклических зависимостей, "путаницы", от Junit и презентация из Lausanne JUG о том, как его использовали для удаления путаницы с Icefaces.

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

Отказ от ответственности: я работаю в Headway Software, разработчиках Restructure101.

person pth - Structure101    schedule 03.04.2011