Existem vários aspectos a considerar em um design como esse:
- as dependências estruturais
- a relação de propriedade (composição i vs. outro tipo de associação)
- as necessidades de navegação
Dependência estrutural entre classes:
Se você pretende reutilizar classes de componentes, evite dependência desnecessária e estruturas circulares fechadas.
No entanto, às vezes duas classes são conceitualmente fortemente interligadas. Nesse caso, evitar a dependência não é uma opção real. Exemplo: uma árvore e suas folhas, ou mais geralmente um composto e seus componentes .
Propriedade dos objetos:
Um objeto possui o outro? Ou de outra forma: se um objeto for destruído, o outro também será destruído?
Este tópico foi abordado em profundidade pelo Snowman, portanto não o abordarei aqui.
Necessidades de navegação entre objetos:
Uma última questão é a necessidade de navegação. Vamos dar o meu exemplo favorito, o padrão de design composto do Gang of four .
Gama e outros. mencione explicitamente a necessidade potencial de ter uma referência pai explícita: " Manter a referência dos componentes filhos para seus pais pode simplificar a travessia e o gerenciamento de uma estrutura composta " É claro que você pode imaginar uma travessia sistemática de cima para baixo, mas para objetos compostos muito grandes pode desacelerar significativamente as operações e de maneira exponencial. Uma referência direta, mesmo circular, pode facilitar significativamente a manipulação de seus compósitos.
Um exemplo pode ser um modelo gráfico de um sistema eletrônico. Uma estrutura composta pode representar as placas eletrônicas, circuitos, elementos. Para exibir e manipular o modelo, você precisará de alguns proxies geométricos em uma visualização da GUI. Portanto, é certamente muito mais fácil navegar do elemento GUI selecionado pelo usuário para o componente, descobrir qual é o pai e com os elementos irmão / irmã relacionados, do que iniciar uma pesquisa de cima para baixo.
Obviamente, como Gamma e cols. Apontaram, você deve garantir os invarientes do relacionamento circular. Isso pode ser complicado, como a pergunta SO a que você se refere mostrou. Mas é perfeitamente gerenciável e de maneira segura.
Conclusão
A necessidade de navegação não deve ser subestimada. Não é sem razão que a UML o abordou explicitamente na notação de modelagem. E sim, há uma situação perfeitamente válida em que referências circulares são necessárias.
O único ponto é que, às vezes, as pessoas tendem a ir nessa direção rapidamente. Portanto, vale a pena considerar todos os três aspectos envolvidos antes de tomar a decisão de fazê-lo ou não.