Eu sugeriria não fazer nenhum.
Tentar aplicar uma camada técnica com uma estrutura de pacote leva a muito emaranhamento em seu aplicativo. Sem mencionar o fato de tentarmos esconder tudo por trás de uma interface de serviço e a primeira coisa que fazemos (principalmente devido ao empacotamento) é tornar tudo a public class
. Isso se torna doloroso quando há uma separação técnica entre a x.y.z.service
e o x.y.z.repository
pacote, agora tudo pode acessar o repositório. Crescimento lá vai o seu encapsulamento dentro da camada de serviço.
Em vez disso, você deve seguir uma abordagem mais funcional e baseada em cebola ( arquitetura limpa , arquitetura hexagonal ). Isso também está alinhado com o Princípio de responsabilidade única (quando aplicado a uma embalagem) e também de acordo com os princípios de embalagem
- Coisas que mudam juntas são empacotadas juntas
- As coisas que são usadas juntas são empacotadas juntas
Oliver Gierke escreveu um bom post sobre componentes de empacotamento em Java. Simon Brown escreveu uma história mais geral sobre o assunto.
Eu me esforçaria por uma estrutura de pacote principal, como a seguir, para manter o núcleo do seu aplicativo:
x.y.z.area1
x.y.z.area2
Agora, se você tiver uma interface da web, adicione, por exemplo, um web
subpacote, ao serviço da web a ws
ou rest
pacote para armazenar apenas isso. Basicamente, ele se conecta ao núcleo.
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
Agora você pode reutilizar os objetos de dentro do seu núcleo para as outras camadas, mas IMHO é melhor usar um domínio específico para essa camada. Assim como no mapeamento de Objeto para SQL, há (frequentemente) uma incompatibilidade no que queremos mostrar na tela ou usar como XML no serviço da Web e como a lógica de negócios é implementada. Dependendo da complexidade dos domínios de negócios e da web, você pode considerá-los como domínios de problemas separados para resolver quais precisam ser conectados, basicamente 2 contextos limitados diferentes .
Para usar uma cotação de um recurso CQRS
Não é possível criar uma solução ideal para pesquisar, gerar relatórios e processar transações utilizando um único modelo.
Não tente colocar tudo em um único modelo (domínio), separe as responsabilidades. Você provavelmente acaba com mais classes (menores), mas com uma separação mais limpa entre as camadas do seu aplicativo.
Nota final
Lembre-se de que criar uma arquitetura é decidir as vantagens e desvantagens de uma solução para outra. Depende muito da complexidade do domínio e deve ser direcionado principalmente pelos requisitos funcionais do seu aplicativo. No entanto, é influenciado pelas restrições não funcionais (desempenho, segurança) e ambientais (idioma a usar, plataforma, experiência). E a arquitetura, como a codificação, nunca é concluída, cada novo requisito pode (e talvez deveria?) Levar a um redesenho do aplicativo.
aviso Legal
Sim, também tentei colocar tudo em um único modelo e, também, tentei usar uma separação técnica em meus aplicativos. No entanto, após alguns anos de experiência na criação de camadas emaranhadas de aplicativos (a princípio parece uma boa idéia, o aplicativo começa a crescer ...), imaginei que deveria haver outra maneira.
Ligações
- Arquitetura Limpa, Tio Bob Martin
- Arquitetura hexagonal (aka portas e adaptadores), Alistair Cockburn
- Opa onde foi minha arquitetura, Oliver Gierke
- Princípios de OOD, tio Bob Martin
- Erros ao aplicar DDD, Udi Dahan
- Contextos limitados, Martin Fowler
- Estilo de codificação arquitetonicamente evidente, Simon Brown
Livros
- Crescimento de software orientado a objetos, guiado por testes
- Arquitetura de aplicativos Java: padrões de modularidade com exemplos usando OSGi (Robert C. Martin Series)
- Design Orientado a Domínio: Lidando com a Complexidade no Coração do Software
- Arquitetura de software para desenvolvedores
- Implementando o design orientado a domínio