Есть несколько аспектов, которые следует учитывать в такой конструкции:
- структурные зависимости
- отношение собственности (то есть состав против другого вида связи)
- навигационные потребности
Структурная зависимость между классами:
Если вы хотите повторно использовать классы компонентов, вам следует избегать ненужных зависимостей и избегать таких замкнутых круговых структур.
Тем не менее, иногда два класса концептуально тесно связаны между собой. В этом случае избежать зависимости не является реальной возможностью. Пример: дерево и его листы или, в более общем случае, композит и его компоненты .
Право собственности на объекты:
Владеет ли один объект другим? Или иным образом заявлено: если один объект уничтожен, будет ли уничтожен и другой?
Эта тема была подробно рассмотрена Snowman, поэтому я не буду здесь ее обсуждать.
Навигация нужна между объектами:
Последний вопрос - необходимость навигации. Давайте возьмем мой любимый пример - шаблон составного дизайна « Банды четырех» .
Гамма и др. прямо упомяните о потенциальной необходимости иметь явную родительскую ссылку: « Сохранение ссылки от дочерних компонентов на их родительский элемент может упростить обход и управление сложной структурой » Конечно, вы можете представить систематический нисходящий обход, но для очень больших составных объектов это может значительно замедлить работу и в геометрической прогрессии. Прямая ссылка, даже круговая, может значительно облегчить манипулирование вашими композитами.
Примером может служить графическая модель электронной системы. Композитная структура может представлять собой электронные платы, схемы, элементы. Чтобы отобразить модель и манипулировать ею, вам понадобятся некоторые геометрические прокси в графическом представлении. Тогда, конечно, гораздо проще перейти от элемента GUI, выбранного пользователем, к компоненту, чтобы выяснить, кто является родителем и с соответствующими элементами «брат / сестра», чем начать поиск сверху вниз.
Конечно, как указали Гамма и др., Вы должны обеспечить неизменность круговых отношений. Это может быть сложно, как показал вопрос SO, на который вы ссылаетесь. Но это совершенно управляемо и безопасно.
Вывод
Навигация не должна быть занижена. Недаром UML явно указал это в нотации моделирования. И да, вполне допустимая ситуация, когда нужны циклические ссылки.
Единственный момент заключается в том, что иногда люди стремятся идти в таком направлении быстро. Так что стоит рассмотреть все 3 аспекта, прежде чем принимать решение пойти на это или нет.