Como as Camadas da Interface do Aplicativo e do Banco de Dados interagem em seus limites?

5

Eu estava assistindo a um dos vídeos do Uncle Bob e ele criou a interface do banco de dados Camada. Ele tinha esse diagrama mostrando isso:

Essassetasmostramqueacamadadeinterfacedebancodedadosestácienteechamaacamadadeaplicativoebancodedados,masnãovice-versa.

Acamadadainterfacedobancodedadostem"registros de dados". Estas são "classes" que possuem o nome da tabela e os campos das colunas. Isso é o que eu geralmente chamo de DTOs. Mas esses registros de dados têm todos os campos públicos e nenhum / poucos métodos.

A camada da Interface do Banco de Dados é responsável por capturar os dados do banco de dados, preencher os "registros de dados" e implementar uma interface na Camada de Aplicação da seguinte forma:

Estou um pouco confuso porque nunca ouvi falar dessa separação antes. Todo projeto em que trabalhei usa os DTOs na visão que aparentemente está errada (pelo menos de acordo com o vídeo do Uncle Bob).

Além disso, nunca trabalhei em um projeto em que a camada de interface de banco de dados chama a camada de aplicativo. É sempre a camada Application solicitando informações à camada de interface do banco de dados. Por exemplo, usando um DAO.

Mas isso está começando a fazer sentido. Sempre que uso hibernar, estou sempre arrancando os cabelos porque tento fazer com que os DTOs sejam mais OO e a biblioteca sempre me enfrente.

Então, eu acho que o que estou tentando perguntar é, como é o código na fronteira entre o Aplicativo e a Camada da Interface do Banco de Dados? Por exemplo, como o Aplicativo obtém a implementação da implementação do Order Gateway? A implementação do Order Gateway é um DAO? Não tenho uma imagem clara de como o POS pode usar o Order Gateway versus como / quando o Order Gateway é preenchido com dados.

    
por Daniel Kaplan 29.03.2013 / 23:09
fonte

3 respostas

1

Eu acho que você interpretou as imagens de uma maneira errada! As setas não representam a direção da chamada na minha opinião.

Quando você olha para a segunda imagem, é óbvio que a Implementação do Order Gateway implementa a interface Order Gateway e os objetos do tipo Order Gateway são usados a partir do tipo de cliente POS. Assim, a direção real da chamada é de cima para baixo, como você esperaria.

Esta é apenas uma aplicação do Strategy Pattern para separar a estrutura do seu banco de dados que está dentro da camada I / F do DB de sua interface que a camada de aplicação usa. Se você não tivesse a camada DB I / F, sua camada de aplicação provavelmente acessaria diretamente estruturas de DB específicas, o que definitivamente não seria o caminho certo para ser flexível com a tecnologia DB.

Editar:

Bem, vamos trazer a noção de DTOs para a nossa mente: Esses são objetos contendo certas quantidades de dados (comportamento não ) agregados para um propósito específico, geralmente para empurrá-los pela rede em sistemas distribuídos . Embora eles sejam usados nesse contexto como Tabela de Pedidos e Tabela de Itens de Linha, não há contradição em usar DTOs para visualizações, uma vez que as exibições também costumam estar vinculadas apenas aos dados.

O objetivo do DAO é, em primeiro lugar, encapsular o máximo possível de tecnologias de fontes de dados. Como o DAO não é apenas um único objeto, mas um padrão incluindo a interface e sua implementação, é possível mapear o padrão DAO diretamente para a interface Order Gateway e Order Gateway Implementation, sem dependências da camada de aplicativo para estruturas de dados específicas.

    
por 15.05.2013 / 14:22
fonte
1

Gostaria de acrescentar que, embora as setas não representem a direção da chamada, o que elas fazem representam é dependência .

Ao introduzir a interface "Order Gateway" na Application Layer, e implementar essa interface na camada de banco de dados, em vez de a camada de aplicação depender da camada de banco de dados, será o oposto; temos invertido a direção da dependência.

Essa é uma estratégia de desacoplamento chamada Inversão de dependência que permite que você troque a camada de banco de dados sem alterar a camada de aplicativo.

    
por 26.02.2017 / 06:19
fonte
0

Acho que sua confusão vem do termo "Interface".

Há uma interface DatabaseInterface e uma implementação DatabaseInterface.

A camada Applicaton conhece e usa a Interface DatabaseInterface para obter dados do banco de dados em objetos dto-s ou daimain.

O DatabaseInterface-Implementation implementa o DatabaseInterface-Interface e conhece / usa dto-s.

Muitos desenvolvedores chamam isso de Padrão de Repositório

Se as setas na sua imagem significam "usa ou chama", então a seta de "Interface" para "ordem" na segunda imagem tem a direção errada . / p>     

por 15.06.2013 / 12:51
fonte