Hay varios aspectos a considerar en dicho diseño:
- las dependencias estructurales
- la relación de propiedad (es decir, composición versus otro tipo de asociación)
- la navegación necesita
Dependencia estructural entre clases:
Si su objetivo es reutilizar las clases de componentes, debe evitar la dependencia innecesaria y evitar tales estructuras circulares cerradas.
Sin embargo, a veces dos clases están conceptualmente fuertemente interconectadas. En este caso, evitar la dependencia no es una opción real. Ejemplo: un árbol y sus hojas, o más generalmente un compuesto y sus componentes .
Propiedad de los objetos:
¿Un objeto posee el otro? O dicho de otra manera: si un objeto es destruido, ¿el otro también será destruido?
Este tema fue abordado en profundidad por Snowman, por lo que no voy a abordarlo aquí.
Necesidades de navegación entre objetos:
Un último problema es la necesidad de navegación. Tomemos mi ejemplo favorito, el patrón de diseño compuesto de la Banda de cuatro .
Gamma y col. Mencione explícitamente la posible necesidad de tener una referencia primaria explícita: " Mantener la referencia de los componentes secundarios a sus padres puede simplificar el recorrido y la gestión de una estructura compuesta ". Por supuesto, puede imaginar un recorrido sistemático de arriba hacia abajo, pero para objetos compuestos muy grandes puede ralentizar significativamente las operaciones y de manera exponencial. Una referencia directa, incluso circular, puede facilitar significativamente la manipulación de sus compuestos.
Un ejemplo podría ser un modelo gráfico de un sistema electrónico. Una estructura compuesta podría representar los tableros electrónicos, circuitos, elementos. Para mostrar y manipular el modelo, necesitaría algunos proxies geométricos en una vista GUI. Sin duda, es mucho más fácil navegar desde el elemento GUI seleccionado por el usuario hasta el componente, para averiguar cuál es el elemento principal y con qué elementos relacionados hermano / hermana, que iniciar una búsqueda de arriba hacia abajo.
Por supuesto, como señalaron Gamma y otros, debe asegurarse de los invariantes de la relación circular. Esto puede ser complicado, como lo ha demostrado la pregunta SO a la que se refiere. Pero es perfectamente manejable y de manera segura.
Conclusión
La necesidad de navegación no debe ser subestimada. No sin razón UML lo ha abordado explícitamente en la notación de modelado. Y sí, hay una situación perfectamente válida donde se necesitan referencias circulares.
El único punto es que a veces las personas tienden a ir en esa dirección rápidamente. Por lo tanto, vale la pena considerar los 3 aspectos involucrados antes de tomar la decisión de hacerlo o no.