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: Figure
es en el paquete figure
, Layout
es en el paquete layout
, Layout
requiere la cifra para llevar a cabo el diseño, por lo que el paquete layout
depende de paquete figure
. Pero, por otro lado, un Figure
puede contener otros Figure
s dentro de él, que tienen el suyo propio Layout
, lo que hace que el paquete figure
dependa del paquete layout
.
He pensado en algunas soluciones, como crear una Container
interfaz que Figure
implemente y ponerla en el Layout
paquete. ¿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
Layout
que 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 laFigure
clase. Del mismo modo, crearía una interfaz para Figure,Drawable
por 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
Layout
tanto como aFigure
, peroLayout
yFigure
ellos 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
Container
interfaz como se sugiere en la pregunta?Container
ir en el mismo paqueteLayout
. Eso no funcionaría, mientras que su solución sí.No tengo muy claro qué
Figure
es, pero ¿quizás debería estar en el mismo paquete queLayout
?Su
Container
solución de interfaz propuesta no funcionaría, a menos que coloque laContainer
interfaz 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
Figure
yLayout
quieren 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