Estoy trabajando en la aplicación RCP, soy nuevo en esta aplicación.
Los beans de primavera se utilizan para escribir lógica de negocios para guardar / recuperar entidades.
Pero, en lugar de enviar entidades directamente al cliente , estamos convirtiendo a DTO y completando el cliente. Mientras guardamos, nuevamente estamos convirtiendo DTO en entidad y guardando.
¿Cuál es el beneficio de estas conversiones? Alguien puede explicar?
What's the benefit of these conversions?
desacoplar el modelo de datos de persistencia del modelo de datos (representación) ofrecido a los consumidores. Los beneficios del desacoplamiento se han discutido ampliamente en SE. Sin embargo, el objetivo debajo de los DTO es reunir en una sola respuesta tanta información como se considere necesaria para que los clientes guarden llamadas al servidor. Lo que hace que la comunicación cliente-servidor sea más fluida.Respuestas:
Cada vez que un desarrollador pregunta "¿cuál es el punto de hacer esto?", Lo que realmente quieren decir es "No veo ningún caso de uso en el que hacerlo proporcione un beneficio". Con ese fin, déjame mostrarte algunos ejemplos.
Todos los ejemplos se basarán en este modelo de datos simple:
Y puede suponer que la aplicación utiliza estos datos de muchas maneras diferentes (informes, formularios, ventanas emergentes, ...).
Toda la aplicación ya existe. Todo lo que menciono es un cambio en la base de código existente. Esto es importante para recordar.
Ejemplo 1 - Cambiar la estructura de datos subyacente - Sin DTO
Los requisitos han cambiado. La edad de la persona debe recuperarse dinámicamente de la base de datos del gobierno (supongamos que se basa en su nombre y apellido).
Como ya no necesita almacenar el
Age
valor localmente, por lo tanto, debe eliminarse de laPerson
entidad. Aquí es importante darse cuenta de que la entidad representa los datos de la base de datos , y nada más. Si no está en la base de datos, no está en la entidad.Cuando recupera la antigüedad del servicio web del gobierno, se almacenará en un objeto diferente (o int).
Pero su interfaz aún muestra una edad. Todas las vistas se han configurado para usar la
Person.Age
propiedad, que ahora ya no existe. Se presenta un problema: todas las vistas que se refieren a laAge
de una persona necesitan ser reparadas .Ejemplo 2 - Cambiar la estructura de datos subyacente - Con DTO
En el antiguo sistema, también hay
PersonDTO
entidades con los mismos cinco propiedades:Id, FirstName, LastName, Age, CityId
. Después de recuperar aPerson
, la capa de servicio lo convierte en ayPersonDTO
luego lo devuelve.Pero ahora, los requisitos han cambiado. La edad de la persona debe recuperarse dinámicamente de la base de datos del gobierno (supongamos que se basa en su nombre y apellido).
Como ya no necesita almacenar el
Age
valor localmente, por lo tanto, debe eliminarse de laPerson
entidad. Aquí es importante darse cuenta de que la entidad representa los datos de la base de datos , y nada más. Si no está en la base de datos, no está en la entidad.Sin embargo, dado que tiene un intermediario
PersonDTO
, es importante ver que esta clase pueda conservar laAge
propiedad. La capa de servicio buscaráPerson
, la convertirá en aPersonDTO
, luego también buscará la edad de la persona del servicio web del gobierno, almacenará ese valorPersonDTO.Age
y pasará ese objeto.La parte importante aquí es que cualquiera que use la capa de servicio no ve una diferencia entre el sistema antiguo y el nuevo . Esto incluye su interfaz. En el sistema anterior, recibía un
PersonDTO
objeto completo . Y en el nuevo sistema, todavía recibe unPersonDTO
objeto completo . Las vistas no necesitan ser actualizadas .Esto es lo que queremos decir cuando usamos la frase separación de inquietudes : hay dos inquietudes diferentes (almacenar los datos en la base de datos, presentar los datos a la interfaz) y necesitan un tipo de datos diferente cada uno. Incluso si esos dos tipos de datos contienen los mismos datos en este momento, eso podría cambiar en el futuro.
En el ejemplo dado,
Age
hay una diferencia entre los dos tipos de datos:Person
(la entidad de la base de datos) no necesita unAge
, peroPersonDTO
(el tipo de datos frontend) sí lo necesita.Al separar las preocupaciones (= crear tipos de datos separados) desde el principio, la base de código es mucho más resistente a los cambios realizados en el modelo de datos.
Podría darte más ejemplos, pero el principio siempre será el mismo.
Para resumir
Person
. Ej. )Name
. Pero el hecho de que todos tengan unaName
propiedad no significa que debamos hacer que hereden de unaEntityWithName
clase base compartida . Las diferentesName
propiedades no tienen una relación significativa.Name
consigue a llamarse aTitle
, o una persona recibe unFirstName
eLastName
), que se tendrá que invertir un mayor esfuerzo deshacer la herencia , que ni siquiera necesita en primer lugar .Como regla general para considerar las preocupaciones de separación, piense de esta manera:
Suponga que cada inquietud (la interfaz de usuario, la base de datos, la lógica) es manejada por una persona diferente en una ubicación diferente. Solo pueden comunicarse por correo electrónico.
En una base de código bien separada, un cambio a una preocupación particular solo deberá ser manejado por una persona:
Si todos estos desarrolladores estuvieran usando la misma
Person
entidad, y se hiciera un cambio menor en la entidad, todos tendrían que participar en el proceso.Pero al usar clases de datos separadas para cada capa, ese problema no es tan frecuente:
PersonDTO
objeto válido , al desarrollador de negocios y de la interfaz de usuario no le importa que haya cambiado la forma en que se almacenan / recuperan los datos.La frase clave aquí es que no les afecta . La implementación de una buena separación de preocupaciones busca minimizar el afectar (y por lo tanto tener que involucrar) a otras partes.
Por supuesto, algunos cambios importantes no pueden evitar incluir a más de una persona, por ejemplo, cuando se agrega una entidad completamente nueva a la base de datos. Pero no subestimes la cantidad de cambios menores que tienes que hacer durante la vida útil de una aplicación. Los cambios importantes son una minoría numérica.
fuente