Cómo resolver dependencias de paquetes circulares

8

Estoy refactorizando una base de código grande donde la mayoría de las clases están ubicadas en un paquete. Para una mejor modularidad, estoy creando subpaquetes para cada funcionalidad.

Recuerdo que aprendí en alguna parte que un gráfico de dependencia del paquete no debería tener bucles, pero no sé cómo resolver el siguiente problema: Figure está en el paquete figure , Layout está en el paquete layout , Layout requiere que la figura realice el diseño, por lo que el paquete layout depende del paquete figure . Pero, por otro lado, un Figure puede contener otro Figure s dentro de él, teniendo su propio Layout , lo que hace que el paquete figure dependa del paquete layout .

Tengo algunas soluciones, como crear una interfaz Container que implementa Figure y ponerla en el paquete Layout . ¿Es esta una buena solución? ¿Alguna otra posibilidad?

Gracias

    
pregunta vainolo 13.02.2013 - 08:36

2 respuestas

6

Debería pensar en Inversión de control

Básicamente, define una interfaz para su Layout que se encuentra en algún lugar cerca de su clase de diseño en un paquete propio, por lo que tendría un paquete de implementación y un paquete de interfaz pública; por ejemplo, llámelo Layoutable (no saber si eso es correcto inglés). Ahora, Layout no implementará esa interfaz sino la clase Figure . Del mismo modo, crearía una interfaz para la Figura que es Drawable , por ejemplo.

Entonces

my.public.package.Layoutable
my.implementation.package.Layout
my.public.package.Drawable
my.implementation.package.Figure

Ahora: la Figura implementa Layoutable y, por lo tanto, Layout la puede usar y (aún no estoy seguro de si eso es lo que quería) - Layout implementa Drawable y puede dibujarse en una Figura. El punto es que la clase que expone algún servicio lo hace disponible a través de una interfaz (aquí: Diseño y Diseño), la clase que quiere usar ese servicio tiene que implementar la interfaz.

Entonces tendrías algo como un objeto creador que une ambos. Por lo tanto, el creador tendría una dependencia de Layout así como de Figure , pero Layout y Figure serían independientes.

Esa es la idea aproximada.

Una excelente fuente de soluciones para estos problemas es el libro Java Application Architecture de Kirk Knoernschild.

    
respondido por el michael_s 13.02.2013 - 12:12
0

No tengo muy claro qué es un Figure , pero quizás debería estar en el mismo paquete que Layout ?

Su solución de interfaz Container propuesta no funcionaría, a menos que coloque la interfaz Container en un tercer paquete, aún tendría una dependencia circular entre los dos paquetes. Consulte la la respuesta de michael_s para obtener información que funcione.

Otra cosa, como han mencionado otros: probablemente nunca será un problema. Solo vas a tener problemas en el futuro si Figure y Layout quieren estar en módulos separados. Puedes lidiar con esto cuando sea necesario, pero dado que las dos clases parecen estar muy relacionadas, parece altamente improbable.

    
respondido por el vaughandroid 13.02.2013 - 12:31

Lea otras preguntas en las etiquetas