Estoy refactorizando una base de código grande donde la mayoría de las clases se encuentran en un paquete. Para una mejor modularidad, estoy creando subpaquetes para cada funcionalidad.
Yo recuerdo haber aprendido en alguna parte que un gráfico de dependencias paquete no debe tener bucles, pero no sé cómo resolver el siguiente problema: Figurees en el paquete figure, Layoutes en el paquete layout, Layoutrequiere la cifra para llevar a cabo el diseño, por lo que el paquete layoutdepende de paquete figure. Pero, por otro lado, un Figurepuede contener otros Figures dentro de él, que tienen el suyo propio Layout, lo que hace que el paquete figuredependa del paquete layout.
He pensado en algunas soluciones, como crear una Containerinterfaz que Figureimplemente y ponerla en el Layoutpaquete. ¿Es esta una buena solución? ¿Alguna otra posibilidad?
Gracias
fuente

Respuestas:
Debe pensar en la Inversión de control
Básicamente, define una interfaz para usted
Layoutque se encuentra en algún lugar cerca de su clase Layout en un paquete propio, por lo que tendría un paquete de implementación y un paquete de interfaz pública; por ejemplo, llámeloLayoutable(no sé si eso es inglés correcto). Ahora: Layout no implementará esa interfaz sino laFigureclase. Del mismo modo, crearía una interfaz para Figure,Drawablepor ejemplo.Entonces
Ahora: la Figura implementa Layoutable y, por lo tanto, puede ser utilizada por Layout y (todavía no estoy seguro si eso es lo que quería): Layout implementa Drawable y se puede dibujar en una Figura. El punto es que la clase que expone algún servicio lo hace disponible a través de una interfaz (aquí: Layout and Layoutable): la clase que quiere usar ese servicio tiene que implementar la interfaz.
Entonces tendrías algo así como un objeto creador que une a ambos. Por lo tanto, el creador tendría una dependencia
Layouttanto como aFigure, peroLayoutyFigureellos mismos serían independientes.Esa es la idea aproximada.
Una excelente fuente de soluciones a estos problemas es el libro Java Application Architecture de Kirk Knoernschild.
fuente
Containerinterfaz como se sugiere en la pregunta?Containerir en el mismo paqueteLayout. Eso no funcionaría, mientras que su solución sí.No tengo muy claro qué
Figurees, pero ¿quizás debería estar en el mismo paquete queLayout?Su
Containersolución de interfaz propuesta no funcionaría, a menos que coloque laContainerinterfaz en un tercer paquete, aún tendría una dependencia circular entre los dos paquetes. Vea la respuesta de michael_s para algo que funcionaría.Otra cosa, como han mencionado otros, probablemente nunca será un problema. Que sólo va a tener problemas en el futuro si
FigureyLayoutquieren estar en distintos módulos . Puede lidiar con esto cuando sea necesario, pero dado que las dos clases parecen estar estrechamente relacionadas, parece muy poco probable.fuente