Нужны ли когда-нибудь циклические ссылки?

Я унаследовал решение Visual Studio, которое содержит многочисленные циклические ссылки между проектами.

Была ли когда-нибудь ситуация, когда это приемлемо удаленно?

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

6
задан John Bubriski 27 August 2010 в 15:54
поделиться

2 ответа

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

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

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

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

Около 10 лет назад мне казалось, что модель «Равиоли» лучше, чем модель «Лазанья». В конце концов, в Java у вас также есть модули Java, которые могут легко вызывать друг друга (и у меня сложилось впечатление, что между всеми различными модулями Java не было реальной структуры). Мне модель Lasagna казалась результатом необъектно-ориентированного старого кода, в то время как модель Ravioli казалась более современной, более объектно-ориентированной.

В настоящее время я склонен возвращаться к модели лазаньи, но со встроенной моделью равиоли. Это:

  • Приложение построено с использованием разных слоев, как в модели Lasagna
  • Но внутри слоев код по-прежнему разделен между разными модулями, которые могут обращаться друг к другу, как в модели Ravioli.

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

Обратите внимание, что циклическая ссылка в этом примере уже может привести к проблемам (класс FileWriter может вызывать класс Debug при записи строки, но класс Debug использует класс FileWriter для записи отладочной информации, результат: переполнение стека).

В этом случае проблему можно легко решить, не используя класс FileWriter в классе Debug, а используя собственные потоки ввода-вывода (если вы разрабатываете на C++). В других случаях решить проблему будет намного сложнее.

8
ответ дан 8 December 2019 в 18:28
поделиться

Хорошее программное обеспечение проектируется слоями с четко разграниченными границами между ними. то есть: если у вас есть слой, вы должны быть в состоянии четко сформулировать, что он делает, почему он там и от чего он зависит. Цикличность затрудняет достижение этого, и, как правило, должна быть удалена. (Microsoft приложила много усилий в Windows 7, чтобы улучшить многоуровневость Windows, удалив Circularities.)

Просто пытаюсь подтвердить свое подозрение, что это приложение ужасно спроектировано.

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

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

2
ответ дан 8 December 2019 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: