Nó có nghĩa là gì để hydrat hóa một đối tượng?


205

Khi ai đó nói về việc hydrat hóa một vật thể, điều đó có nghĩa là gì?

Tôi thấy một dự án Java có tên Hydrate trên web chuyển đổi dữ liệu giữa các biểu diễn khác nhau (RDMS thành OOPS thành XML). Đây có phải là ý nghĩa chung của hydrat hóa đối tượng; để chuyển đổi dữ liệu giữa các đại diện? Nó có thể có nghĩa là xây dựng lại một hệ thống phân cấp đối tượng từ một đại diện được lưu trữ?


3
Xin vui lòng xem câu hỏi này, trong đó có một câu trả lời tuyệt vời. Đó không hoàn toàn là cùng một câu hỏi, vì vậy tôi không bỏ phiếu để đóng. Nhưng nó giải thích quá trình hydrat hóa tốt: stackoverflow.com/questions/4929243/
trộm

Câu trả lời:


124

Đối với thuật ngữ hydrat chung hơn

Hydrat hóa một đối tượng đang lấy một đối tượng tồn tại trong bộ nhớ, chưa chứa bất kỳ dữ liệu miền nào (dữ liệu "thực"), sau đó điền dữ liệu đó vào dữ liệu miền (như từ cơ sở dữ liệu, từ mạng hoặc từ tệp hệ thống).

Từ ý kiến ​​của Erick Robertson về câu trả lời này:

khử lưu huỳnh == khởi tạo + hydrat hóa

Nếu bạn không cần lo lắng về hiệu suất phồng rộp và bạn không gỡ lỗi tối ưu hóa hiệu suất nằm trong phần bên trong của API truy cập dữ liệu, thì có lẽ bạn không cần phải xử lý rõ ràng việc hydrat hóa. Bạn thường sẽ sử dụng deserialization thay vì để bạn có thể viết mã ít hơn. Một số API truy cập dữ liệu không cung cấp cho bạn tùy chọn này và trong những trường hợp đó, bạn cũng phải tự gọi bước hydrat hóa một cách rõ ràng.

Để biết thêm một chút chi tiết về khái niệm Hydration, hãy xem câu trả lời của Erick Robertson cho cùng câu hỏi này.

Đối với dự án Java được gọi là hydrate

Bạn đã hỏi về khung này một cách cụ thể, vì vậy tôi đã xem xét nó.

Theo như tôi có thể nói, tôi không nghĩ rằng dự án này đã sử dụng từ "hydrate" theo nghĩa rất chung chung. Tôi thấy việc sử dụng nó trong tiêu đề như một từ đồng nghĩa gần đúng cho "tuần tự hóa". Như đã giải thích ở trên, cách sử dụng này không hoàn toàn chính xác:

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

dịch cấu trúc dữ liệu hoặc trạng thái đối tượng sang định dạng có thể được lưu trữ [...] và được xây dựng lại sau này trong cùng môi trường máy tính khác.

Tôi không thể tìm thấy lý do đằng sau tên của họ trực tiếp trên Câu hỏi thường gặp về Hydrate , nhưng tôi đã có manh mối cho ý định của họ. Tôi nghĩ rằng họ đã chọn cái tên "Hydrate" vì mục đích của thư viện tương tự như khung Hibernate giống âm thanh phổ biến , nhưng nó được thiết kế với ý tưởng làm việc hoàn toàn ngược lại.

Hầu hết các ORM, bao gồm Hibernate, thực hiện một cách tiếp cận hướng mô hình đối tượng trong bộ nhớ, với cơ sở dữ liệu đang xem xét thứ hai. Thay vào đó, thư viện Hydrate sử dụng cách tiếp cận theo sơ đồ cơ sở dữ liệu, bảo toàn cấu trúc dữ liệu quan hệ của bạn và để chương trình của bạn hoạt động trên đầu chúng sạch sẽ hơn.

Nói một cách ẩn dụ, vẫn liên quan đến tên của thư viện này: Hydrate giống như "làm cho một cái gì đó sẵn sàng để sử dụng" (như làm ẩm lại thực phẩm khô ). Nó là một ẩn dụ trái ngược với Hibernate , giống như "bỏ đi một thứ gì đó cho mùa đông" (như Hibernation động vật ).

Quyết định đặt tên cho thư viện Hydrate, theo như tôi có thể nói, không liên quan đến thuật ngữ lập trình chung của máy tính "hydrate".

Khi sử dụng thuật ngữ lập trình máy tính chung "hydrate", tối ưu hóa hiệu suất thường là động lực (hoặc gỡ lỗi tối ưu hóa hiện có). Ngay cả khi thư viện hỗ trợ kiểm soát chi tiết về thời điểm và cách các đối tượng được điền dữ liệu, thời gian và hiệu suất dường như không phải là động lực chính cho tên hoặc chức năng của thư viện. Thư viện dường như quan tâm nhiều hơn đến việc cho phép ánh xạ từ đầu đến cuối và bảo tồn lược đồ.


79
-1 Hydration liên quan đến việc lấp đầy một đối tượng hiện có với dữ liệu. Nó không phải là một từ đồng nghĩa cho tuần tự hóa.
Erick Robertson

20
Nó cũng không phải là một từ đồng nghĩa với khử lưu huỳnh. Deserialization liên quan đến việc tạo đối tượng với dữ liệu mà nó có tại thời điểm nó được tuần tự hóa. Hydration đề cập đến cách bạn điền vào một đối tượng với dữ liệu. Đó là một sự khác biệt tinh tế, nhưng nó là một sự khác biệt. Bạn không thể, ví dụ, khử lưu huỳnh một phần đối tượng. (ít nhất, không thông qua bất kỳ API tiêu chuẩn nào)
Erick Robertson

5
Tất cả chúng ta đang cố gắng học hỏi. Nếu tôi tin rằng nó không cần thiết, tôi sẽ xóa nó và tôi đánh giá cao cuộc thảo luận. Câu trả lời của tôi không phải là trung tâm Java, vì tôi hầu như đã sử dụng thuật ngữ "hydrat hóa" liên quan đến PHP thực sự. Câu trả lời cho câu hỏi "Hydrating một đối tượng có nghĩa là gì?" là "điền một đối tượng hiện có với dữ liệu." Đối tượng phải tồn tại trước khi bạn có thể hydrat hóa nó, điều này không đúng với quá trình khử lưu huỳnh. deserialization == instantiation + hydration
Erick Robertson

2
Xin lỗi, tôi có một vấn đề gắn thẻ bạn trong câu trả lời này, Merlyn Morgan-Graham. Nó sẽ bị xóa khi tôi lưu nó. Tôi cũng có vấn đề với việc thổi phồng được đánh đồng với quá trình khử lưu huỳnh. Tôi đã chỉnh sửa bài viết Wikipedia được liên kết để xóa yêu cầu không được hỗ trợ. Thổi phồng với tôi ngụ ý một số loại thói quen giải nén. Một thói quen tuần tự hóa là trực giao để nén.
Erick Robertson

2
@ErickRobertson Lưu ý bên: @fookhông cần thiết khi trả lời tác giả bài viết.
Duncan Jones

230

Hydrat đề cập đến quá trình lấp đầy một đối tượng với dữ liệu. Một đối tượng chưa được hydrat hóa đã được khởi tạo và thể hiện một thực thể có dữ liệu, nhưng dữ liệu chưa được tải vào đối tượng. Đây là một cái gì đó được thực hiện vì lý do hiệu suất.

Ngoài ra, thuật ngữ hydrat hóa được sử dụng khi thảo luận về kế hoạch tải dữ liệu từ cơ sở dữ liệu hoặc các nguồn dữ liệu khác. Dưới đây là một số ví dụ:

Bạn có thể nói rằng một đối tượng được hydrat hóa một phần khi bạn chỉ tải một số trường vào nó, nhưng không phải tất cả chúng. Điều này có thể được thực hiện bởi vì các trường khác không cần thiết cho các hoạt động hiện tại của bạn. Vì vậy, không có lý do gì để lãng phí băng thông và chu kỳ CPU tải, chuyển và thiết lập dữ liệu này khi nó sẽ không được sử dụng.

Ngoài ra, có một số ORM, chẳng hạn như Doctrine, không hydrat hóa các đối tượng khi chúng được khởi tạo, mà chỉ khi dữ liệu được truy cập trong đối tượng đó. Đây là một phương pháp giúp không tải dữ liệu sẽ không được sử dụng.


7
+1; Đây là một câu trả lời đầy đủ hơn của tôi, trong bối cảnh của Java và Hydration. Nó vẫn hoàn toàn đồng nghĩa với thuật ngữ khử lưu huỳnh chung, như câu trả lời của tôi đã nêu, nhưng được sử dụng phổ biến nhất trong ORM. Điều này là do API ORM thường cung cấp quyền kiểm soát đối với tập dữ liệu họ truy xuất, cho phép bạn sử dụng lại ánh xạ đối tượng hiện có thay vì phải viết ánh xạ mới cho mỗi truy vấn bạn viết. Có thể muốn đề cập rằng bạn đang nói về "lười tải", vì câu hỏi và trả lời này hoàn toàn là về thuật ngữ :)
Merlyn Morgan-Graham

1
Có đúng không khi gọi một quá trình ngược lại để lấy dữ liệu từ đối tượng - trích xuất? Trích xuất dữ liệu từ đối tượng.
Oleg Abrazhaev

43

Trong khi đó là tiếng địa phương có phần dư thừa như Merlyn đã đề cập, trong kinh nghiệm của tôi nó đề cập chỉ để điền / Populating một đối tượng, không instantiating / tạo ra nó, vì vậy nó là một từ rất hữu ích khi bạn cần phải được chính xác.


5
Tôi đã thay đổi suy nghĩ của mình, và bây giờ tôi đồng ý rằng câu trả lời này chính xác hơn câu trả lời cũ của tôi. Tôi đã chỉnh sửa câu trả lời của mình (vì nó đã được chấp nhận và tôi muốn nó chính xác). Bây giờ hy vọng nó bây giờ phản ánh sự khác biệt giữa khử lưu huỳnh và hydrat hóa (đặc biệt, deserialization == instantiation + hydration).
Merlyn Morgan-Graham

8

Đây là một câu hỏi khá cũ, nhưng dường như vẫn còn nhầm lẫn về ý nghĩa của các thuật ngữ sau đây. Hy vọng, điều này sẽ định hướng.

Hydrat

Khi bạn thấy các mô tả có nội dung như "một đối tượng đang chờ dữ liệu đang chờ được ngậm nước", điều đó thật khó hiểu và gây hiểu lầm. Các đối tượng không chờ đợi mọi thứ và hydrat hóa chỉ là hành động lấp đầy một đối tượng bằng dữ liệu.

Sử dụng JavaScript làm ví dụ:

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

Bất cứ điều gì thêm giá trị objlà "hydrat hóa" nó. Tôi chỉ sử dụng Object.assign()trong ví dụ này.

Vì các thuật ngữ "tuần tự hóa" và "giải trừ" cũng được đề cập trong các câu trả lời khác, đây là các ví dụ để giúp phân biệt ý nghĩa của các khái niệm đó từ hydrat hóa:

Nối tiếp

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

Giải trừ

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.