O que significa hidratar um objeto?

205

Quando alguém fala sobre hidratar um objeto, o que isso significa?

Eu vejo um projeto Java chamado Hydrate na Web que transforma dados entre diferentes representações (RDMS para OOPS em XML). Esse é o significado geral da hidratação do objeto; transformar dados entre representações? Poderia significar reconstruir uma hierarquia de objetos a partir de uma representação armazenada?

Jim
fonte
3
Por favor, veja também esta pergunta, que tem uma ótima resposta. Não é exatamente a mesma pergunta, então não vou votar para fechar. Mas isso explica bem a hidratação: stackoverflow.com/questions/4929243/…
Erick Robertson

Respostas:

124

Com relação ao termo mais genérico hidrato

Hidratar um objeto é pegar um objeto que existe na memória, que ainda não contém dados de domínio (dados "reais") e preenchê-lo com dados de domínio (como de um banco de dados, da rede ou de um arquivo sistema).

Dos comentários de Erick Robertson sobre esta resposta:

desserialização == instanciação + hidratação

Se você não precisa se preocupar com um desempenho empolgante e não está depurando otimizações de desempenho que estão nas internas de uma API de acesso a dados, provavelmente não precisa lidar com a hidratação explicitamente. Você normalmente usaria desserialização para poder escrever menos código. Algumas APIs de acesso a dados não oferecem essa opção e, nesses casos, você também deve chamar explicitamente a etapa de hidratação.

Para um pouco mais de detalhes sobre o conceito de hidratação, veja a resposta de Erick Robertson sobre essa mesma pergunta.

Com relação ao projeto Java chamado hydrate

Você perguntou especificamente sobre essa estrutura, então eu a examinei.

O melhor que posso dizer, não acho que este projeto tenha usado a palavra "hidrato" em um sentido muito genérico. Eu vejo o seu uso no título como um sinônimo aproximado de "serialização". Como explicado acima, esse uso não é totalmente preciso:

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

traduzindo estruturas de dados ou estado do objeto em um formato que pode ser [...] armazenado e reconstruído posteriormente no mesmo ou em outro ambiente de computador.

Não consigo encontrar o motivo por trás do nome deles diretamente no FAQ sobre hidratos , mas tenho pistas sobre a intenção deles. Eu acho que eles escolheram o nome "Hydrate" porque o objetivo da biblioteca é semelhante à estrutura popular do Hibernate , semelhante ao som , mas foi projetada com o fluxo de trabalho exatamente oposto em mente.

A maioria dos ORMs, incluindo o Hibernate, adota uma abordagem orientada ao modelo de objeto na memória, com o banco de dados tendo uma segunda consideração. Em vez disso, a biblioteca Hydrate adota uma abordagem orientada ao esquema de banco de dados, preservando suas estruturas de dados relacionais e deixando o programa trabalhar sobre elas de maneira mais limpa.

Metaforicamente falando, ainda com relação ao nome desta biblioteca: Hidrato é como "preparar algo para ser usado" (como reidratar os alimentos secos ). É um oposto metafórico do Hibernate , que é mais como "guardar algo para o inverno" (como Animal Hibernation ).

A decisão de nomear a biblioteca Hydrate, tanto quanto posso dizer, não estava relacionada ao termo genérico de programação de computadores "hydrate".

Ao usar o termo genérico de programação de computador "hidratar", as otimizações de desempenho geralmente são a motivação (ou depuração das otimizações existentes). Mesmo que a biblioteca suporte controle granular sobre quando e como os objetos são preenchidos com dados, o tempo e o desempenho não parecem ser a principal motivação para o nome ou a funcionalidade da biblioteca. A biblioteca parece mais preocupada em ativar o mapeamento de ponta a ponta e a preservação de esquema.

Merlyn Morgan-Graham
fonte
79
-1 Hidratação refere-se ao preenchimento de um objeto existente com dados. Não é sinônimo de serialização.
precisa
20
Também não é sinônimo de desserialização. A desserialização envolve a criação do objeto com os dados que possuía no momento em que foi serializado. Hidratação refere-se a como você preenche um objeto com dados. É uma diferença sutil, mas é uma diferença. Você não pode, por exemplo, desserializar parcialmente um objeto. (pelo menos, não por meio de qualquer padrão API)
Erick Robertson
5
Estamos todos tentando aprender. Se eu achar que é desnecessário, vou removê-lo e aprecio a discussão. Minha resposta não é centrada em Java, pois na maioria das vezes eu usei o termo "hidratação" no que diz respeito ao PHP. A resposta para a pergunta "O que significa hidratar um objeto?" é "preencher um objeto existente com dados". O objeto precisa existir antes que você possa hidratá-lo, o que não é verdade para a desserialização. deserialization == instantiation + hydration
Erick Robertson
2
Desculpe, estou com problemas para marcar você nesta resposta, Merlyn Morgan-Graham. Está sendo removido quando eu o salvo. Também discordo de inflar ser equiparado a desserialização. Editei o artigo vinculado da Wikipedia para remover a reivindicação não enviada. Inflar para mim implica algum tipo de rotina de descompressão. Uma rotina de serialização é ortogonal à compactação.
Erick Robertson
2
@ErickRobertson Nota lateral: @foonão é necessário ao responder ao autor da postagem.
Duncan Jones
230

Hidratação refere-se ao processo de preenchimento de um objeto com dados. Um objeto que ainda não foi hidratado foi instanciado e representa uma entidade que possui dados, mas os dados ainda não foram carregados no objeto. Isso é feito por motivos de desempenho.

Além disso, o termo hidratação é usado ao discutir planos para carregar dados de bancos de dados ou outras fontes de dados. aqui estão alguns exemplos:

Você poderia dizer que um objeto está parcialmente hidratado quando você carregou apenas alguns dos campos, mas não todos. Isso pode ser feito porque esses outros campos não são necessários para suas operações atuais. Portanto, não há razão para desperdiçar largura de banda e ciclos de CPU carregando, transferindo e configurando esses dados quando não serão utilizados.

Além disso, existem alguns ORMs, como o Doctrine, que não hidratam objetos quando são instanciados, mas apenas quando os dados são acessados ​​nesse objeto. Este é um método que ajuda a não carregar dados que não serão usados.

Erick Robertson
fonte
7
+1; Esta é uma resposta mais completa que a minha, no contexto de Java e Hidratação. Ainda é completamente sinônimo do termo geral desserialização, como minha resposta afirmou, mas é mais comumente usado em ORMs. Isso ocorre porque as APIs do ORM geralmente oferecem controle sobre o conjunto de dados que eles recuperam, permitindo que você reutilize um mapeamento de objeto existente em vez de precisar escrever novos mapeamentos para cada consulta que você escreve. Pode querer mencionar que você está falando "carregamento lento", uma vez que este Q & A é tudo sobre a terminologia :)
Merlyn Morgan-Graham
1
É correto chamar um processo oposto de obter dados da extração de objetos? Extrair dados do objeto.
Oleg Abrazhaev
43

Embora seja vernáculo um pouco redundante, como Merlyn mencionou, na minha experiência, refere-se apenas ao preenchimento / preenchimento de um objeto, não à instanciação / criação, por isso é uma palavra útil quando você precisa ser preciso.

J. Dimeo
fonte
5
Mudei de idéia e agora concordo que essa resposta é mais precisa do que minha antiga. Desde então, editei minha resposta (desde que ela foi aceita e quero que seja precisa). Agora espero que agora reflita a diferença entre desserialização e hidratação (em particular deserialization == instantiation + hydration).
Merlyn Morgan-Graham
8

Essa é uma pergunta bastante antiga, mas parece que ainda há confusão sobre o significado dos termos a seguir. Felizmente, isso vai desambiguar.

Hidrato

Quando você vê descrições que dizem coisas como "um objeto que está aguardando dados, está esperando para ser hidratado", isso é confuso e enganoso. Os objetos não esperam as coisas, e a hidratação é apenas o ato de preencher um objeto com dados.

Usando JavaScript como o exemplo:

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

Tudo o que agrega valores objé "hidratá-lo". Estou apenas usando Object.assign()neste exemplo.

Como os termos "serializar" e "desserializar" também foram mencionados em outras respostas, aqui estão exemplos para ajudar a desambiguar o significado desses conceitos da hidratação:

Serializar

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

Desserializar

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