Que signifie hydrater un objet?

206

Quand quelqu'un parle d'hydrater un objet, qu'est-ce que cela signifie?

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

Jim
la source
3
Veuillez également consulter cette question, qui a une excellente réponse. Ce n'est pas tout à fait la même question, donc je ne vote pas pour clore. Mais cela explique bien l'hydratation: stackoverflow.com/questions/4929243/…
Erick Robertson

Réponses:

126

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

Hydrater un objet, c'est prendre un objet qui existe en mémoire, qui ne contient pas encore de données de domaine ("vraies" données), puis le remplir avec des données de domaine (comme une base de données, du réseau ou d'un fichier) système).

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

désérialisation == instanciation + hydratation

Si vous n'avez pas à vous soucier des 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, vous n'avez probablement pas besoin de traiter explicitement l'hydratation. Vous utiliseriez généralement la désérialisation place pour pouvoir écrire moins de code. Certaines API d'accès aux données ne vous offrent pas cette option, et dans ces cas, vous devrez également appeler explicitement l'étape d'hydratation vous-même.

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

En ce qui concerne le projet Java appelé hydrate

Vous avez posé des questions sur ce cadre en particulier, alors je l'ai examiné.

Autant que je sache, je ne pense pas que ce projet utilise 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, cette utilisation n'est pas entièrement exacte:

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 un autre.

Je ne trouve pas la raison de leur nom directement sur la FAQ Hydrate , mais j'ai eu des indices sur leur intention. Je pense qu'ils ont choisi le nom "Hydrate" parce que le but de la bibliothèque est similaire au cadre Hibernate populaire , mais il a été conçu avec le flux de travail opposé exact à l'esprit.

La plupart des ORM, Hibernate inclus, adoptent une approche orientée modèle objet en mémoire, la base de données prenant la seconde considération. La bibliothèque Hydrate adopte à la place une approche orientée schéma de base de données, préservant vos structures de données relationnelles et permettant à votre programme de fonctionner par dessus plus proprement.

Métaphoriquement parlant, toujours en ce qui concerne le nom de cette bibliothèque: Hydrate est comme "faire quelque chose de prêt à l'emploi" (comme réhydrater les aliments secs ). C'est un opposé métaphorique d' Hibernate , qui ressemble plus à «ranger quelque chose pour l'hiver» (comme Animal Hibernation ).

La décision de nommer la bibliothèque Hydrate, pour autant que je sache, ne concernait pas le terme de programmation informatique générique "hydrate".

Lorsque vous utilisez le terme de programmation informatique générique "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 un contrôle granulaire sur le moment et la manière dont les objets sont remplis de données, le moment et les performances ne semblent pas être la principale motivation du nom ou des fonctionnalités de la bibliothèque. La bibliothèque semble plus soucieuse d'activer le mappage de bout en bout et la préservation du schéma.

Merlyn Morgan-Graham
la source
79
-1 L'hydratation fait référence au remplissage d'un objet existant avec des données. Ce n'est pas un synonyme de sérialisation.
Erick Robertson
20
Ce n'est pas non plus synonyme de désérialisation. La désérialisation consiste à créer l'objet avec les données qu'il possédait au moment de sa sérialisation. L'hydratation fait référence à la façon dont vous remplissez 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. (au moins, pas via une API standard)
Erick Robertson
5
Nous essayons tous d'apprendre. Si je pense que ce n'est pas nécessaire, je le supprimerai et j'apprécie la discussion. Ma réponse n'est pas centrée sur Java, car j'ai surtout utilisé le terme "hydratation" en ce qui concerne PHP en fait. La réponse à la question "Que signifie hydrater un objet?" consiste à "remplir un objet existant avec des données". L'objet doit exister avant de pouvoir l'hydrater, ce qui n'est pas le cas pour la désérialisation. deserialization == instantiation + hydration
Erick Robertson
2
Désolé, j'ai du mal à vous taguer dans cette réponse, Merlyn Morgan-Graham. Il est supprimé lorsque je le sauvegarde. Je m'oppose également à ce que le gonflage soit assimilé à la désérialisation. J'ai modifié l'article Wikipédia lié pour supprimer la réclamation sans source. Gonfler pour moi implique une sorte de routine de décompression. Une routine de sérialisation est orthogonale à la compression.
Erick Robertson du
2
@ErickRobertson Note latérale: le @foon'est pas nécessaire pour répondre à l'auteur du message.
Duncan Jones
230

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 les données n'ont pas encore été chargées dans l'objet. C'est quelque chose qui est fait pour des raisons de performances.

De plus, le terme hydratation est utilisé lors de l'examen des plans de chargement des données à partir de bases de données ou d'autres sources de données. Voici quelques exemples:

Vous pourriez dire qu'un objet est partiellement hydraté lorsque vous n'y avez chargé que certains champs, mais pas tous. Cela peut être fait car ces autres champs ne sont pas nécessaires pour vos opérations actuelles. Il n'y a donc aucune raison de gaspiller la bande passante et les cycles de processeur en chargeant, transférant et définissant ces données lorsqu'elles ne seront pas utilisées.

De plus, il existe certains ORM, tels que Doctrine, qui n'hydratent pas les objets lorsqu'ils sont instanciés, mais uniquement lorsque les données sont accessibles dans cet objet. Il s'agit d'une méthode qui permet de ne pas charger de données qui ne seront pas utilisées.

Erick Robertson
la source
7
+1; C'est une réponse plus complète que la mienne, dans le contexte de 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'a indiqué, mais est le plus couramment utilisé dans les ORM. En effet, les API ORM offrent souvent un contrôle sur l'ensemble des données qu'elles récupèrent, vous permettant de réutiliser un mappage d'objet existant au lieu d'avoir à écrire de nouveaux mappages pour chaque requête que vous écrivez. Je pourrais mentionner que vous parlez de "chargement paresseux", car ce Q&A est tout au sujet de la terminologie :)
Merlyn Morgan-Graham
1
Est-il correct d'appeler un processus opposé pour obtenir des données à partir de l'extraction d'objets? Extraire les données de l'objet.
Oleg Abrazhaev
43

Bien qu'il soit quelque peu vernaculaire redondant comme l'a mentionné Merlyn, selon mon expérience, il se réfère uniquement au remplissage / remplissage d'un objet, pas à son instanciation / création, c'est donc un mot utile lorsque vous devez être précis.

J. Dimeo
la source
5
J'ai changé d'avis et maintenant je suis d'accord pour dire que cette réponse est plus exacte que mon ancienne réponse. J'ai depuis modifié ma réponse (car elle a été acceptée et je veux qu'elle soit exacte). Espérons que cela reflète maintenant la différence entre la désérialisation et l'hydratation (en particulier deserialization == instantiation + hydration).
Merlyn Morgan-Graham
8

C'est une question assez ancienne, mais il semble qu'il y ait encore confusion sur la signification des termes suivants. Espérons que cela va lever l'ambiguïté.

Hydrater

Lorsque vous voyez des descriptions qui disent des choses comme «un objet qui attend des données, attend d'être hydraté», c'est déroutant et trompeur. Les objets n'attendent pas les choses, et l'hydratation n'est que l'acte de remplir un objet avec des données.

Utiliser 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 de la valeur, objc'est «l'hydrater». J'utilise juste Object.assign()dans cet exemple.

Étant donné que les termes «sérialiser» et «désérialiser» ont également été mentionnés dans d'autres réponses, voici des exemples pour aider à lever l'ambiguïté de 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}'));
jonschlinkert
la source