Je travaille sur l'application RCP, je suis nouveau sur cette application.
Les beans Spring sont utilisés pour écrire la logique métier pour enregistrer / récupérer des entités.
Mais, au lieu d'envoyer des entités directement au client, nous nous convertissons en DTO et remplissons le client. Lors de la sauvegarde, nous convertissons à nouveau DTO en entité et enregistrons.
Quel est l'avantage de ces conversions? Quelqu'un peut-il expliquer?
What's the benefit of these conversions?
découpler le modèle de données de persistance du modèle de données (représentation) proposé aux consommateurs. Les avantages du découplage ont été largement discutés dans SE. Cependant, l'objectif sous les DTO est de rassembler en une seule réponse autant d'informations que nécessaire pour que les clients puissent enregistrer les appels vers le serveur. Ce qui rend la communication client-serveur plus fluide.Réponses:
Chaque fois qu'un développeur demande "quel est l'intérêt de faire cela?", Ce que cela signifie vraiment, c'est "je ne vois aucun cas d'utilisation où cela offre un avantage". À cette fin, permettez-moi de vous montrer quelques exemples.
Tous les exemples seront basés sur ce modèle de données simple:
Et vous pouvez supposer que l'application utilise ces données de différentes manières (rapports, formulaires, popups, ...).
L'application entière existe déjà. Tout ce que je mentionne est une modification de la base de code existante. C'est important à retenir.
Exemple 1 - Modification de la structure de données sous-jacente - Sans DTO
Les exigences ont changé. L'âge de la personne doit être extrait dynamiquement de la base de données du gouvernement (supposons en fonction de son prénom et de son nom).
Comme vous n'avez plus besoin de stocker la
Age
valeur localement, elle doit donc être supprimée de l'Person
entité. Il est important ici de se rendre compte que l'entité représente les données de la base de données , et rien de plus. Si ce n'est pas dans la base de données, ce n'est pas dans l'entité.Lorsque vous récupérez l'âge du service Web du gouvernement, celui-ci sera stocké dans un autre objet (ou int).
Mais votre frontend affiche toujours un âge. Toutes les vues ont été configurées pour utiliser la
Person.Age
propriété, qui n'existe plus. Un problème se pose: toutes les vues qui se réfèrent à laAge
personne doivent être corrigées .Exemple 2 - Modification de la structure de données sous-jacente - Avec DTO
Dans l'ancien système, il y a aussi une
PersonDTO
entité avec les mêmes cinq propriétés:Id, FirstName, LastName, Age, CityId
. Après avoir récupéré unPerson
, la couche de service le convertit en unPersonDTO
, puis le renvoie.Mais maintenant, les exigences ont changé. L'âge de la personne doit être extrait dynamiquement de la base de données du gouvernement (supposons en fonction de son prénom et de son nom).
Comme vous n'avez plus besoin de stocker la
Age
valeur localement, elle doit donc être supprimée de l'Person
entité. Il est important ici de se rendre compte que l'entité représente les données de la base de données , et rien de plus. Si ce n'est pas dans la base de données, ce n'est pas dans l'entité.Cependant, puisque vous avez un intermédiaire
PersonDTO
, il est important de voir que cette classe peut conserver laAge
propriété. La couche de service récupérera lePerson
, le convertira en unPersonDTO
, puis récupérera également l'âge de la personne sur le service Web du gouvernement, stockera cette valeur dansPersonDTO.Age
et passera cet objet.La partie importante ici est que quiconque utilise la couche de service ne voit pas de différence entre l'ancien et le nouveau système . Cela inclut votre frontend. Dans l'ancien système, il recevait un
PersonDTO
objet complet . Et dans le nouveau système, il reçoit toujours unPersonDTO
objet complet . Les vues n'ont pas besoin d'être mises à jour .C'est ce que nous voulons dire lorsque nous utilisons l'expression séparation des préoccupations : il y a deux préoccupations différentes (stockage des données dans la base de données, présentation des données à l'interface) et elles ont chacune besoin d'un type de données différent. Même si ces deux types de données contiennent les mêmes données à l'heure actuelle, cela pourrait changer à l'avenir.
Dans l'exemple donné, il
Age
y a une différence entre les deux types de données:Person
(l'entité de base de données) n'a pas besoin d'unAge
, maisPersonDTO
(le type de données frontal) en a besoin.En séparant les préoccupations (= création de types de données distincts) depuis le début, la base de code est beaucoup plus résistante aux modifications apportées au modèle de données.
Je pourrais vous donner plus d'exemples mais le principe sera toujours le même.
Résumer
Person
)Name
. Mais ce n'est pas parce qu'ils ont tous uneName
propriété que nous devons les faire hériter d'uneEntityWithName
classe de base partagée . Les différentesName
propriétés n'ont pas de relation significative.Name
est renomméeTitle
ou si une personne obtient unFirstName
etLastName
), vous devrez consacrer plus d'efforts à annuler l'héritage dont vous n'aviez même pas besoin en premier lieu .En règle générale, pour envisager de séparer les préoccupations, pensez-y de cette façon:
Supposons que toutes les préoccupations (l'interface utilisateur, la base de données, la logique) soient gérées par une personne différente dans un emplacement différent. Ils ne peuvent communiquer que par email.
Dans une base de code bien séparée, une modification d'une préoccupation particulière ne devra être gérée que par une seule personne:
Si tous ces développeurs utilisaient la même
Person
entité et qu'une modification mineure était apportée à l'entité, tout le monde devrait être impliqué dans le processus.Mais en utilisant des classes de données distinctes pour chaque couche, ce problème n'est pas aussi répandu:
PersonDTO
objet valide , l'entreprise et le développeur de l'interface utilisateur ne se soucient pas qu'il ait changé la façon dont les données sont stockées / récupérées.La phrase clé ici est qu'elle ne les affecte pas . La mise en œuvre d'une bonne séparation des préoccupations vise à minimiser les répercussions (et donc à impliquer) les autres parties.
Bien sûr, certains changements majeurs ne peuvent pas éviter d'inclure plus d'une personne, par exemple lorsqu'une entité entièrement nouvelle est ajoutée à la base de données. Mais ne sous-estimez pas le nombre de modifications mineures que vous devez apporter pendant la durée de vie d'une application. Les changements majeurs sont une minorité numérique.
la source