Estou refatorando uma grande base de código em que a maioria das classes está localizada em um pacote. Para uma melhor modularidade, estou criando subpacotes para cada funcionalidade.
Lembro-me de aprender em algum lugar que um gráfico de dependência de pacote não deve ter loops, mas não sei como resolver o seguinte problema: Figure
está no pacote figure
, Layout
está no pacote layout
, Layout
requer a figura para executar o layout, portanto, o pacote layout
depende do pacote figure
. Mas, por outro lado, a Figure
pode conter outros Figure
s dentro dele, tendo o seu próprio Layout
, o que torna o pacote figure
dependente do pacote layout
.
Eu tenho algumas soluções, como criar uma Container
interface que Figure
implementa e colocá-lo no Layout
pacote. Esta é uma boa solução? Alguma outra possibilidade?
obrigado
fonte
Respostas:
Você deve pensar em Inversão do controle
Você basicamente define uma interface para a sua,
Layout
localizada em algum lugar próximo à sua classe Layout em um pacote próprio, para ter um pacote de implementação e um pacote de interface pública - por exemplo, chame-oLayoutable
(não sei se esse é o inglês adequado). Agora - o layout não implementará essa interface, mas aFigure
classe. Da mesma forma, você criaria uma interface para a Figura,Drawable
por exemplo.então
Agora - a figura implementa Layoutable e, portanto, pode ser usada pelo Layout e (ainda não tenho certeza se é isso que você queria) - o layout implementa Drawable e pode ser desenhado em uma figura. O ponto é que a classe que expõe algum serviço o torna disponível por uma interface (aqui: Layout e Layoutable) - a classe que deseja usar esse serviço precisa implementar a interface.
Então você teria algo como um objeto criador que une os dois. Assim, o criador teria uma dependência
Layout
bem comoFigure
, masLayout
eFigure
eles próprios seria independente.Essa é a ideia aproximada.
Uma excelente fonte de soluções para esses problemas é o livro Java Application Architecture de Kirk Knoernschild.
fonte
Container
interface sugerida na pergunta?Container
o mesmo pacote queLayout
. Isso não funcionaria, enquanto sua solução funcionaria.Eu não sou muito claro sobre o que
Figure
é, mas talvez deva estar no mesmo pacote queLayout
?Sua
Container
solução de interface proposta não funcionaria - a menos que você coloque aContainer
interface em um terceiro pacote, você ainda terá uma dependência circular entre os dois pacotes. Veja a resposta de michael_s para algo que funcione.Outra coisa, como outros já mencionaram - provavelmente nunca será um problema. Você só vai ter problemas no futuro se
Figure
eLayout
quer estar em separado módulos . Você pode lidar com isso se e quando isso for necessário, mas, como as duas classes parecem muito relacionadas, isso parece altamente improvável.fonte