298 votes

Qu'est-ce que cela signifie d'hydrater un objet ?

Quand on parle d'hydrater un objet, qu'est-ce que ça veut dire ?

Je vois sur le web un projet Java appelé Hydrate qui transforme les données entre différentes représentations (RDMS à OOPS à XML). Est-ce le sens général de l'hydratation d'objets ; transformer des données entre des représentations ? Cela pourrait-il signifier reconstruire une hiérarchie d'objets à partir d'une représentation stockée ?

4 votes

Veuillez également consulter cette question, dont la réponse est excellente. Ce n'est pas tout à fait la même question, donc je ne vais pas voter pour la fermer. Mais elle explique bien l'hydratation : stackoverflow.com/questions/4929243/

0 votes

Je pense que c'est la même question : "que veut dire hydrate". Le vote est terminé.

337voto

Erick Robertson Points 12958

L'hydratation fait référence au processus de remplissage d'un objet avec des données. Un objet qui n'a pas encore été hydraté a été instancié et représente une entité qui possède des données, mais ces dernières n'ont pas encore été chargées dans l'objet. Cette opération est effectuée pour des raisons de performance.

En outre, le terme "hydratation" est utilisé lorsqu'il est question de plans de chargement de données à partir de bases de données ou d'autres sources de données. En voici quelques exemples :

On pourrait dire qu'un objet est partiellement hydraté lorsque vous n'y avez chargé que certains des champs, mais pas tous. Cela peut être fait parce que ces autres champs ne sont pas nécessaires pour vos opérations actuelles. Il n'y a donc aucune raison de gaspiller de la bande passante et des cycles CPU pour charger, transférer et paramétrer ces données lorsqu'elles ne seront pas utilisées.

De plus, certains ORM, comme Doctrine, n'hydratent pas les objets lorsqu'ils sont instanciés, mais seulement lorsque les données sont accédées dans cet objet. C'est une méthode qui permet de ne pas charger des données qui ne vont pas être utilisées.

16 votes

+1 ; C'est une réponse plus complète que la mienne, dans le contexte de la Java et de l'Hydratation. Il est toujours complètement synonyme du terme général de désérialisation, comme ma réponse l'indiquait, mais il est le plus souvent utilisé dans les ORM. Cela est dû au fait que les API ORM offrent souvent un contrôle sur l'ensemble des données qu'elles récupèrent, ce qui vous permet de réutiliser un mappage d'objet existant au lieu de devoir écrire de nouveaux mappages pour chaque requête que vous écrivez. Il serait bon de mentionner que vous parlez de "lazy-loading", puisque ce Q&R est consacré à la terminologie :)

2 votes

Est-il correct d'appeler un processus opposé d'obtention de données à partir d'un objet - extraction ? Extraire des données d'un objet.

184voto

Merlyn Morgan-Graham Points 31815

En ce qui concerne le terme plus générique hydrater

L'hydratation d'un objet consiste à prendre un objet qui existe en mémoire, qui ne contient pas encore de données de domaine (données "réelles"), puis à le remplir de données de domaine (provenant par exemple d'une base de données, du réseau ou d'un système de fichiers).

D'après les commentaires d'Erick Robertson sur cette réponse :

désérialisation == instanciation + hydratation

Si vous n'avez pas besoin de vous soucier de performances fulgurantes et que vous ne déboguez pas les optimisations de performances qui se trouvent dans les internes d'une API d'accès aux données, alors vous n'avez probablement pas besoin de vous occuper explicitement de l'hydratation. Vous utiliserez généralement désérialisation à la place, ce qui vous permet d'écrire moins de code. Certaines API d'accès aux données ne vous offrent pas cette option et, dans ce cas, vous devez également appeler explicitement l'étape d'hydratation vous-même.

Pour un peu plus de détails sur le concept d'hydratation, voir Réponse d'Erick Robertson sur cette même question.

En ce qui concerne le projet Java appelé hydrate

Vous avez posé une question sur ce cadre spécifique, alors je l'ai examiné.

Pour autant que je sache, je ne pense pas que ce projet ait utilisé le mot "hydrate" dans un sens très générique. Je vois son utilisation dans le titre comme un synonyme approximatif de "sérialisation". Comme expliqué ci-dessus, cet usage n'est pas tout à fait exact :

Voir : http://en.wikipedia.org/wiki/Serialization

traduire les structures de données ou l'état des objets dans un format qui peut être stocké [...] et reconstruit ultérieurement dans le même environnement informatique ou dans un autre.

Je ne peux pas trouver la raison derrière leur nom directement sur la FAQ de l'Hydrate mais j'ai eu des indices sur leurs intentions. Je pense qu'ils ont choisi le nom "Hydrate" parce que l'objectif de la bibliothèque est similaire à celui de la populaire imitation sonore Cadre Hibernate mais il a été conçu dans l'optique d'un flux de travail exactement inverse.

La plupart des ORM, y compris Hibernate, adoptent une approche orientée modèle objet en mémoire, la base de données passant au second plan. La bibliothèque Hydrate adopte au contraire une approche orientée schéma de base de données, préservant vos structures de données relationnelles et permettant à votre programme de travailler sur elles de manière plus propre.

Métaphoriquement parlant, toujours en ce qui concerne le nom de cette bibliothèque : Hydratez c'est comme "rendre quelque chose prêt à l'emploi" (comme réhydrater Aliments séchés ). Il s'agit d'un opposé métaphorique de Hibernate ce qui revient plutôt à "mettre quelque chose de côté pour l'hiver" (comme L'hibernation des animaux ).

La décision de nommer la bibliothèque Hydrate, pour autant que je sache, n'était pas liée au terme générique de programmation informatique "hydrate".

Lorsque l'on utilise le terme générique de programmation informatique "hydrate", les optimisations de performances sont généralement la motivation (ou le débogage des optimisations existantes). Même si la bibliothèque prend en charge le contrôle granulaire du moment et de la manière dont les objets sont remplis de données, le timing et les performances ne semblent pas être la motivation première du nom ou de la fonctionnalité de la bibliothèque. La bibliothèque semble plus soucieuse de permettre le mappage de bout en bout et la préservation des schémas.

89 votes

-1 L'hydratation consiste à remplir un objet existant avec des données. Il ne s'agit pas d'un synonyme de sérialisation.

1 votes

@ErickRobertson : Je n'ai jamais écrit que c'était la sérialisation. En fait, j'ai écrit que c'était le contraire. Vous voulez relire ma réponse et retirer votre downvote ?

22 votes

Ce n'est pas non plus un synonyme de désérialisation. La désérialisation consiste à créer l'objet avec les données qu'il avait au moment où il a été sérialisé. L'hydratation fait référence à la manière dont on remplit un objet avec des données. C'est une différence subtile, mais c'est une différence. Vous ne pouvez pas, par exemple, désérialiser partiellement un objet. (du moins, pas par le biais d'une API standard)

53voto

J. Dimeo Points 143

Bien qu'il s'agisse d'un terme quelque peu redondant comme l'a mentionné Merlyn, d'après mon expérience, il fait référence à uniquement à remplir/peupler un objet, et non à l'instancier/créer, c'est donc un mot utile lorsqu'il faut être précis.

9 votes

J'ai changé d'avis, et je reconnais maintenant que cette réponse est plus précise que mon ancienne réponse. J'ai depuis édité ma réponse (puisqu'elle a été acceptée, et que je veux qu'elle soit exacte). J'espère maintenant qu'elle reflète la différence entre la désérialisation et l'hydratation (en particulier, deserialization == instantiation + hydration ).

33voto

jonschlinkert Points 3511

Il s'agit d'une question assez ancienne, mais il semble qu'il y ait encore de la confusion sur la signification des termes suivants. Nous espérons que cela permettra de lever les ambiguïtés.

Hydratez

Lorsque vous voyez des descriptions qui disent des choses comme "un objet qui attend des données, attend d'être hydraté", cela prête à confusion et induit en erreur. Les objets n'attendent pas de choses, et l'hydratation est juste l'acte de remplir un objet avec des données.

En utilisant JavaScript comme exemple :

const obj = {}; // empty object
const data = { foo: true, bar: true, baz: true };

// Hydrate "obj" with "data" 
Object.assign(obj, data); 
console.log(obj.foo); // true
console.log(obj.bar); // true
console.log(obj.baz); // true

Tout ce qui ajoute des valeurs à obj l'"hydrate". J'utilise juste Object.assign() dans cet exemple.

Puisque les termes "sérialiser" et "désérialiser" ont également été mentionnés dans d'autres réponses, voici des exemples pour aider à désambiguïser la signification de ces concepts de l'hydratation :

Sérialiser

console.log(JSON.stringify({ foo: true, bar: true, baz: true }));

Désérialiser

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));

4 votes

Un gros plus pour les exemples concrets.

0voto

user2928048 Points 291

En PHP, vous pouvez créer une nouvelle classe à partir de son nom, sans invoquer le constructeur, comme ceci :

require "A.php";
$className = "A";
$class = new \ReflectionClass($className);
$instance = $class->newInstanceWithoutConstructor();

Ensuite, vous pouvez hydrater l'invocation des setters (ou attributs publics)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X