Cenário:
- Pilha: Java, Spring, Hibernação.
- Modelo: Aplicativo Cliente-Servidor.
- Padrão: Model-View-Controller (MVC).
As classes da camada de serviço têm três comportamentos:
Alguns serviços têm a regra de negócios dentro dos métodos e delegam a persistência ao aplicativo. Gostar:
EntityManager.save (entidade);
Alguns serviços simplesmente chamam uma função de banco de dados (passando parâmetros)
CallableStatement cls = con.prepareCall ("{chamar databaseFunction (args)}");
Alguns serviços têm métodos com ambos os comportamentos.
Minhas perguntas:
- Existe algum problema em ter os serviços de aplicativos chamando diretamente as funções do banco de dados? Isso não é considerado uma prática ruim? O que seria um modelo de arquitetura aplicável a um projeto como este?
- Existe algum problema em ter o comportamento misturado no mesmo serviço? Tais como transações e consistência?
- No caso de manutenção, esse encapsulamento torna obscuro para o desenvolvedor que ele também deve alterar as funções no banco de dados? Como evitar isso?
- Esse cenário ocorre em outros aplicativos ao redor do mundo ou foi apenas um erro de arquitetura?
design-patterns
architecture
mvc
code-quality
linuxunil
fonte
fonte
Respostas:
Eu acho que existe. Você está colocando um conhecimento sobre os internos do banco de dados no serviço de aplicativo. Alterar o banco de dados de qualquer forma (alterar o mecanismo de armazenamento ou até renomear um campo ou criar um índice) pode exigir a alteração do serviço de aplicativo e isso viola o SRP .
Veja o comentário abaixo.
Não acredito que haja um problema técnico, mas existe um lógico. Você apenas mistura duas abordagens no aplicativo, tornando-o vago, menos estruturado e difícil de se adaptar às mudanças. Veja os comentários acima sobre a violação do SRP também.
Claro que sim.
Coloque métodos e funções que trabalham diretamente com o banco de dados em um nível separado de abstração (seja uma camada DAO ou um padrão de repositório simples - depende da complexidade do seu aplicativo)
Eu acho que no nosso mundo tudo acontece;)
fonte
De acordo com o que você disse, há uma camada de serviço, portanto o padrão arquitetural que parece adequado é a Arquitetura em Camadas. Referência adicional
Sim, geralmente é uma prática ruim fazer chamadas diretas ao banco de dados que não sejam uma camada de acesso a dados, para que a camada comercial acesse apenas uma abstração do banco de dados.
Quanto aos comportamentos de mistura, o uso de algum padrão de design como padrão DAO ou padrão de repositório pode ajudar a delegar essas responsabilidades, melhorando assim o código.
Algumas das vantagens de usar um padrão de design e um ORM é a legibilidade do seu código, o encapsulamento das responsabilidades, portanto, se o acesso ao seu banco de dados mudar, a camada de negócios não deve mudar muito.
fonte