Estou trabalhando no aplicativo RCP, sou novo nesse aplicativo.
Spring beans são usados para escrever lógica de negócios para salvar / buscar entidades.
Mas, em vez de enviar entidades diretamente para o cliente , estamos convertendo em DTOs e preenchendo o cliente. Ao salvar, novamente estamos convertendo o DTO em entidade e salvando.
Qual é o benefício dessas conversões? Alguém pode explicar?
What's the benefit of these conversions?
dissociar o modelo de dados de persistência do modelo de dados (representação) oferecido aos consumidores. Os benefícios da dissociação foram amplamente discutidos no SE. No entanto, o objetivo dos DTOs é reunir em uma única resposta quantas informações forem necessárias para os clientes salvarem chamadas no servidor. O que torna a comunicação cliente-servidor mais suave.Respostas:
Sempre que um desenvolvedor pergunta "qual é o sentido de fazer isso?", O que eles realmente querem dizer é "não vejo nenhum caso de uso em que isso forneça um benefício". Para esse fim, deixe-me mostrar alguns exemplos.
Todos os exemplos serão baseados neste modelo de dados simples:
E você pode supor que o aplicativo use esses dados de várias maneiras (relatórios, formulários, pop-ups, ...).
O aplicativo inteiro já existe. Tudo o que eu mencionei é uma alteração na base de código existente. Isso é importante lembrar.
Exemplo 1 - Alterando a estrutura de dados subjacente - sem DTO
Os requisitos foram alterados. A idade da pessoa precisa ser recuperada dinamicamente do banco de dados do governo (vamos assumir com base no nome e sobrenome).
Como você não precisa mais armazenar o
Age
valor localmente, ele precisa ser removido daPerson
entidade. É importante perceber aqui que a entidade representa os dados do banco de dados e nada mais. Se não estiver no banco de dados, não está na entidade.Quando você recupera a idade do serviço da web do governo, ele será armazenado em um objeto (ou int) diferente.
Mas seu frontend ainda exibe uma idade. Todas as visualizações foram configuradas para usar a
Person.Age
propriedade, que agora não existe mais. Um problema se apresenta: todas as visualizações que se referem àAge
pessoa precisam ser corrigidas .Exemplo 2 - Alterando a estrutura de dados subjacente - Com DTO
No sistema antigo, também há
PersonDTO
entidade com as mesmas cinco propriedades:Id, FirstName, LastName, Age, CityId
. Após recuperar aPerson
, a camada de serviço a converte em aPersonDTO
e depois a devolve.Mas agora, os requisitos mudaram. A idade da pessoa precisa ser recuperada dinamicamente do banco de dados do governo (vamos assumir com base no nome e sobrenome).
Como você não precisa mais armazenar o
Age
valor localmente, ele precisa ser removido daPerson
entidade. É importante perceber aqui que a entidade representa os dados do banco de dados e nada mais. Se não estiver no banco de dados, não está na entidade.No entanto, como você tem um intermediário
PersonDTO
, é importante ver que essa classe pode manter aAge
propriedade. A camada de serviço buscaráPerson
, converterá em aPersonDTO
e também buscará a idade da pessoa no serviço web do governo, armazenará esse valorPersonDTO.Age
e passará esse objeto.A parte importante aqui é que quem usa a camada de serviço não vê diferença entre o antigo e o novo sistema . Isso inclui seu frontend. No sistema antigo, ele recebeu um
PersonDTO
objeto completo . E no novo sistema, ele ainda recebe umPersonDTO
objeto completo . As visualizações não precisam ser atualizadas .É isso que queremos dizer quando usamos a frase separação de preocupações : Existem duas preocupações diferentes (armazenar os dados no banco de dados, apresentar os dados ao front-end) e eles precisam de um tipo de dados diferente para cada um. Mesmo que esses dois tipos de dados contenham os mesmos dados agora, isso pode mudar no futuro.
No exemplo dado,
Age
há uma diferença entre os dois tipos de dados:Person
(a entidade do banco de dados) não precisa de umAge
, masPersonDTO
(o tipo de dados de front-end) precisa.Ao separar as preocupações (= criar tipos de dados separados) desde o início, a base de código é muito mais resistente às alterações feitas no modelo de dados.
Eu poderia lhe dar mais exemplos, mas o princípio sempre será o mesmo.
Resumir
Person
)Name
. Mas apenas porque todos eles têm umaName
propriedade, não significa que devemos fazê-los herdar de umaEntityWithName
classe base compartilhada . As diferentesName
propriedades não têm relação significativa.Name
é renomeadaTitle
ou uma pessoa recebe umFirstName
eLastName
), elas terão que se esforçar mais para desfazer a herança que você nem precisava em primeiro lugar .Como regra geral para considerar a separação de preocupações, pense da seguinte maneira:
Suponha que todas as preocupações (a interface do usuário, o banco de dados, a lógica) sejam tratadas por uma pessoa diferente em um local diferente. Eles só podem se comunicar por email.
Em uma base de código bem separada, uma alteração em uma preocupação específica precisará ser tratada apenas por uma pessoa:
Se todos esses desenvolvedores usassem a mesma
Person
entidade e uma pequena alteração fosse feita na entidade, todos precisariam estar envolvidos no processo.Mas, usando classes de dados separadas para cada camada, esse problema não é tão prevalente:
PersonDTO
objeto válido , o desenvolvedor de negócios e a interface do usuário não se importam se ele mudou a maneira como os dados são armazenados / recuperados.A frase-chave aqui é que isso não os afeta . A implementação de uma boa separação de preocupações busca minimizar a afetação (e, portanto, a necessidade de envolver) outras partes.
Obviamente, algumas mudanças importantes não podem evitar a inclusão de mais de uma pessoa, por exemplo, quando uma entidade totalmente nova é adicionada ao banco de dados. Mas não subestime a quantidade de pequenas alterações que você precisa fazer durante a vida útil de um aplicativo. As principais mudanças são uma minoria numérica.
fonte