У такій конструкції слід врахувати кілька аспектів:
- структурні залежності
- відносини власності (тобто склад проти інших видів асоціацій)
- навігаційні потреби
Структурна залежність між класами:
Якщо ви спрямовані на повторне використання компонентних класів, вам слід уникати зайвої залежності та уникати таких закритих кругових структур.
Однак іноді два класи концептуально сильно взаємопов'язані. У цьому випадку уникнення залежності не є реальним варіантом. Приклад: дерево та його листя, або загалом композит та його компоненти .
Право власності на об'єкти:
Чи один об’єкт володіє іншим? Або інакше сказано: якщо один об'єкт знищений, чи буде знищений і другий?
Цю тему Сніговик глибоко розглядав, тому я не збираюся тут її зачіпати.
Потреби в навігації між об'єктами:
Останнє питання - необхідність навігації. Давайте візьмемо мій улюблений приклад, в складовою шаблон проектування в Бандах чотири .
Гамма та ін. чітко згадуйте про потенційну потребу мати чітке посилання на батьків: " Підтримання посилання від дочірніх компонентів до їхнього батьків може спростити обхід і управління складеною структурою " Звичайно, ви могли б уявити собі систематичний обхід зверху вниз, але для дуже великих складових об'єктів це може значно уповільнити операції та експоненціально. Пряме посилання, навіть кругова, може значно полегшити маніпулювання вашими композитами.
Прикладом може бути графічна модель електронної системи. Складена структура могла представляти електронні плати, схеми, елементи. Щоб відобразити та маніпулювати моделлю, вам знадобляться деякі геометричні проксі у вікні графічного інтерфейсу. Тоді, звичайно, набагато простіше перейти від елемента, призначеного користувачем GUI, до компонента, щоб дізнатись, хто є батьківським і з якими пов'язаними елементами брат / сестра, ніж починати пошук зверху вниз.
Звичайно, як вказували Гамма та ін, ви повинні забезпечити інваріанти кругових відносин. Це може бути складним, як показало питання ТА, на яке ви посилаєтесь. Але це ідеально керовано та безпечно.
Висновок
Потреба в навігації не повинна бути недооціненою. Недарма UML чітко звертався до цього в нотації моделювання. І так, є цілком справедлива ситуація, коли потрібні циркулярні посилання.
Єдине, що інколи люди, як правило, швидко йдуть у такий напрямок. Тому варто врахувати всі три аспекти, перш ніж приймати рішення, чи потрібно його робити чи ні.