Co to znaczy nawodnić obiekt?

204

Co to oznacza, gdy ktoś mówi o nawodnieniu obiektu?

W sieci widzę projekt Java o nazwie Hydrate, który przekształca dane między różnymi reprezentacjami (RDMS na OOPS na XML). Czy to jest ogólne znaczenie nawodnienia obiektu; przekształcić dane między reprezentacjami? Czy może to oznaczać zrekonstruowanie hierarchii obiektów z przechowywanej reprezentacji?

Jim
źródło
3
Zobacz także to pytanie, które ma świetną odpowiedź. To nie do końca to samo pytanie, więc nie głosuję na zakończenie. Ale dobrze wyjaśnia nawodnienie: stackoverflow.com/questions/4929243/...
Erick Robertson,

Odpowiedzi:

124

W odniesieniu do bardziej ogólnego terminu hydrat

Nawodnienie obiektu polega na pobraniu obiektu istniejącego w pamięci, który nie zawiera jeszcze żadnych danych domeny („rzeczywistych” danych), a następnie zapełnienie go danymi domeny (np. Z bazy danych, z sieci lub z pliku system).

Z komentarzy Ericka Robertsona do tej odpowiedzi:

deserializacja == tworzenie instancji + nawodnienie

Jeśli nie musisz martwić się o zawirowania wydajności i nie debugujesz optymalizacji wydajności, które są wbudowane w interfejs API dostępu do danych, prawdopodobnie nie musisz jawnie zajmować się nawodnieniem. Zazwyczaj zamiast tego użyłbyś deserializacji , abyś mógł napisać mniej kodu. Niektóre interfejsy API dostępu do danych nie dają tej opcji, a w takich przypadkach musisz również samodzielnie wywołać krok nawodnienia.

Aby uzyskać więcej szczegółów na temat koncepcji nawodnienia, zobacz odpowiedź Ericka Robertsona na to samo pytanie.

W odniesieniu do projektu Java o nazwie hydrate

Pytałeś konkretnie o ten framework, więc przyjrzałem się mu.

Najlepiej, jak mogę powiedzieć, nie sądzę, aby ten projekt używał słowa „nawodnić” w bardzo ogólnym znaczeniu. Widzę jego użycie w tytule jako przybliżony synonim „serializacji”. Jak wyjaśniono powyżej, to użycie nie jest całkowicie dokładne:

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

tłumaczenie struktur danych lub stanu obiektu na format, który można zapisać [...] i odtworzyć później w tym samym lub innym środowisku komputerowym.

Nie mogę znaleźć przyczyny ich nazwy bezpośrednio w Hydrate FAQ , ale dostałem wskazówki na temat ich zamiaru. Myślę, że wybrali nazwę „Hydrate”, ponieważ przeznaczenie biblioteki jest podobne do popularnego, podobnego do dźwięku frameworku Hibernacja , ale zostało zaprojektowane z myślą o dokładnie odwrotnym przepływie pracy.

Większość ORM, w tym Hibernacja, przyjmuje podejście zorientowane na model obiektowy w pamięci, przy czym baza danych bierze pod uwagę drugie. Zamiast tego biblioteka Hydrate przyjmuje podejście zorientowane na schemat bazy danych, zachowując relacyjne struktury danych i pozwalając programowi na pracę nad nimi bardziej czysto.

Mówiąc metaforycznie, wciąż w odniesieniu do nazwy tej biblioteki: Hydrate jest jak „tworzenie czegoś gotowego do użycia” (jak ponowne nawadnianie suszonej żywności ). Jest to metaforyczne przeciwieństwo Hibernacji , które bardziej przypomina „odkładanie czegoś na zimę” (jak Animal Hibernation ).

O ile mogę powiedzieć, decyzja o nazwie biblioteki Hydrate nie dotyczyła ogólnego terminu programowania komputerowego „hydrate”.

Podczas używania ogólnego terminu programowania „hydrat” optymalizacje wydajności są zazwyczaj motywacją (lub debugowaniem istniejących optymalizacji). Nawet jeśli biblioteka obsługuje szczegółową kontrolę nad tym, kiedy i jak obiekty są zapełniane danymi, czas i wydajność nie wydają się być główną motywacją dla nazwy lub funkcjonalności biblioteki. Biblioteka wydaje się bardziej zainteresowana włączaniem mapowania od końca do końca i zachowaniem schematu.

Merlyn Morgan-Graham
źródło
79
-1 Nawodnienie oznacza wypełnienie istniejącego obiektu danymi. To nie jest synonim serializacji.
Erick Robertson,
20
Nie jest to również synonim deserializacji. Deserializacja polega na utworzeniu obiektu z danymi, które miał w momencie serializacji. Nawodnienie odnosi się do sposobu wypełnienia obiektu danymi. To subtelna różnica, ale to różnica. Nie można na przykład częściowo dokonać deserializacji obiektu. (przynajmniej nie za pośrednictwem żadnego standardowego interfejsu API)
Erick Robertson
5
Wszyscy próbujemy się uczyć. Jeśli uważam, że jest to zbędne, usunę je i doceniam dyskusję. Moja odpowiedź nie jest zorientowana na Javę, ponieważ właściwie używałem terminu „nawodnienie” w odniesieniu do PHP. Odpowiedź na pytanie „Co oznacza nawodnienie obiektu?” to „wypełnianie istniejącego obiektu danymi”. Obiekt musi istnieć, zanim będzie można go nawodnić, co nie jest prawdą w przypadku deserializacji. deserialization == instantiation + hydration
Erick Robertson,
2
Przepraszam, mam problem z oznaczeniem Cię w tej odpowiedzi, Merlyn Morgan-Graham. Jest usuwany, kiedy go zapisuję. Mam również problem z nadmuchiwaniem, które utożsamiane jest z deserializacją. Zredagowałem połączony artykuł z Wikipedii, aby usunąć pozyskane roszczenie. Napompowanie dla mnie oznacza jakąś rutynę dekompresyjną. Procedura serializacji jest ortogonalna do kompresji.
Erick Robertson
2
@ErickRobertson Uwaga dodatkowa: @foonie jest potrzebna, aby odpowiedzieć autorowi postu.
Duncan Jones
230

Nawodnienie odnosi się do procesu wypełniania obiektu danymi. Obiekt, który nie został jeszcze uwodniony, został utworzony w postaci instancji i reprezentuje byt, który ma dane, ale dane nie zostały jeszcze załadowane do obiektu. To jest zrobione ze względu na wydajność.

Ponadto termin „nawodnienie” jest używany przy omawianiu planów ładowania danych z baz danych lub innych źródeł danych. Oto kilka przykładów:

Można powiedzieć, że obiekt jest częściowo uwodniony, gdy załadujesz do niego tylko niektóre pola, ale nie wszystkie. Można to zrobić, ponieważ te inne pola nie są konieczne do bieżących operacji. Nie ma więc powodu, aby marnować przepustowość i cykle procesora ładując, przesyłając i ustawiając te dane, gdy nie będą używane.

Ponadto istnieją pewne ORM, takie jak Doctrine, które nie nawadniają obiektów po ich utworzeniu, ale tylko wtedy, gdy dane są dostępne w tym obiekcie. Jest to jedna metoda, która pomaga nie ładować danych, które nie będą używane.

Erick Robertson
źródło
7
+1; To jest bardziej kompletna odpowiedź niż moja, w kontekście Java i Hydration. Nadal jest całkowicie synonimem ogólnego terminu deserializacji, jak stwierdziła moja odpowiedź, ale najczęściej jest stosowana w ORM. Wynika to z faktu, że interfejsy API ORM często oferują kontrolę nad zestawem pobieranych danych, co pozwala na ponowne wykorzystanie istniejącego mapowania obiektów zamiast konieczności pisania nowych mapowań dla każdego wpisywanego zapytania. Może chciałbym wspomnieć, że mówisz o „leniwym ładowaniu”, ponieważ te pytania dotyczą terminologii :)
Merlyn Morgan-Graham
1
Czy można wywołać odwrotny proces pobierania danych z obiektu - ekstrakcję? Wyodrębnij dane z obiektu.
Oleg Abrazhaev
43

Chociaż jest nieco zbędny, jak wspomniał Merlyn, z mojego doświadczenia odnosi się tylko do wypełniania / wypełniania obiektu, a nie tworzenia go / tworzenia, więc jest to użyteczne słowo, kiedy trzeba być precyzyjnym.

J. Dimeo
źródło
5
Zmieniłem zdanie i teraz zgadzam się, że ta odpowiedź jest dokładniejsza niż moja stara odpowiedź. Od tego czasu zredagowałem swoją odpowiedź (ponieważ została zaakceptowana i chcę, aby była dokładna). Mam nadzieję, że teraz odzwierciedla różnicę między deserializacją a nawodnieniem (w szczególności deserialization == instantiation + hydration).
Merlyn Morgan-Graham
8

To dość stare pytanie, ale wydaje się, że nadal istnieje zamieszanie co do znaczenia poniższych terminów. Mamy nadzieję, że będzie to jednoznaczne.

Hydrat

Kiedy widzisz opisy, takie jak: „obiekt, który czeka na dane, czeka na uwodnienie”, jest to mylące i mylące. Obiekty nie czekają na rzeczy, a nawodnienie to po prostu wypełnienie obiektu danymi.

Używając JavaScript jako przykładu:

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

Wszystko, co dodaje wartości, obj„uwadnia” ją. Po prostu używam Object.assign()w tym przykładzie.

Ponieważ terminy „serializować” i „deserializować” zostały również wspomniane w innych odpowiedziach, oto przykłady, które pomagają ujednoznacznić znaczenie tych pojęć z uwodnienia:

Serializuj

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

Deserializuj

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
jonschlinkert
źródło