Sự khác biệt giữa dữ liệu của người dùng ẩn giấu phần cứng và phần mềm đóng gói của mình là gì?


29

Tôi đang đọc "Java đồng thời trong thực tế" và có nói: "May mắn thay, các kỹ thuật hướng đối tượng tương tự giúp bạn viết các lớp có thể tổ chức tốt, có thể duy trì - như đóng gói và ẩn dữ liệu - cũng có thể giúp bạn tạo luồng an toàn các lớp học."

Vấn đề # 1 - Tôi chưa bao giờ nghe về việc ẩn dữ liệu và không biết nó là gì.

Vấn đề # 2 - Tôi luôn nghĩ rằng đóng gói là sử dụng riêng so với công khai và thực sự là ẩn dữ liệu.

Bạn có thể giải thích ẩn dữ liệu là gì và nó khác với đóng gói như thế nào không?


2
Đọc mã Hoàn thành phiên bản 2 . Nó sẽ trả lời nhiều câu hỏi của bạn.
Shiplu Mokaddim


Liên kết này có những hiểu biết hữu ích về Thông tin này Ẩn một nguyên tắc thiết kế, chỉ định rằng một quyết định thiết kế nên được ẩn khỏi phần còn lại của hệ thống để ngăn chặn sự ghép đôi ngoài ý muốn. Nó sẽ thông báo cho cách bạn gói gọn mọi thứ, nhưng tất nhiên là không phải như vậy. Encapsulation là một tính năng ngôn ngữ lập trình.
Abhijeet

Câu trả lời:


19

Ẩn dữ liệu và thông tin là một khái niệm rộng hơn, được tìm thấy trong khoa học máy tính & kỹ thuật phần mềm. Nó đề cập đến thực tế là những phần của chương trình máy tính có thể thay đổi không thể truy cập được từ các mô-đun khác / từ máy khách.

Encapsulation là một thuật ngữ được tìm thấy trong mô hình hướng đối tượng và đề cập đến việc giữ dữ liệu trong các trường riêng tư và chỉ sửa đổi nó thông qua các phương thức.

Do đó, đóng gói có thể được coi là một cách để đạt được ẩn dữ liệu trong các hệ thống hướng đối tượng .


1
Cảm ơn bạn đã trả lời. Tôi vẫn không hiểu, tại sao nếu ẩn dữ liệu là như nhau nhưng chỉ rộng hơn một chút so với đóng gói, nó được nhắc đến trong cuốn sách như thể chúng có độ rộng tương tự và không bao gồm một cái khác.
dhblah

Các tác giả có thể tạo ra sự khác biệt từ ẩn dữ liệu và ẩn thông tin theo nghĩa là ẩn dữ liệu chỉ che giấu các cấu trúc dữ liệu - các trường riêng - trong khi ẩn thông tin có thể đề cập đến việc đóng gói các chi tiết triển khai (ví dụ thuật toán được sử dụng) chỉ được thực hiện thông qua giao diện.
m3th0dman

2
Bạn có thể có cái này mà không cần cái kia - nhìn vào Python, nơi không có dữ liệu nào ẩn (không có thuộc tính riêng tư hoặc được bảo vệ).
Latty

Quan điểm của @ Lattyware là rất đúng và quan trọng. Người ta cũng có thể đóng gói (theo định nghĩa của bạn, mà tôi phản đối vì những gì tôi mô tả ở đây) mà không che giấu bất cứ điều gì, cụ thể là bằng cách mù quáng phơi bày một getter tầm thường và setter cho mọi thành viên. Điều đó không che giấu bất cứ điều gì và không ngăn chặn bất cứ điều gì, nhưng đáp ứng định nghĩa chung về đóng gói cho bức thư.

1
Đóng gói không giữ dữ liệu trong lĩnh vực riêng tư, đó là ẩn nhiều thông tin hơn. Nói chung, đóng gói là khái niệm kết hợp (đóng gói) thông tin / dữ liệu và phương thức vào một lớp.
nbro

6

Đóng gói và ẩn dữ liệu là các điều khoản liên quan. Điều quan trọng là phải hiểu rằng chúng phát sinh liên quan đến Trừu tượng . Booch et. al. trong phân tích hướng đối tượng và thiết kế với các ứng dụng giải thích,

Trừu tượng hóa và đóng gói là các khái niệm bổ sung: Trừu tượng tập trung vào hành vi có thể quan sát được của một đối tượng, trong khi đóng gói tập trung vào việc thực hiện làm phát sinh hành vi này. Đóng gói thường đạt được thông qua việc che giấu thông tin (không chỉ che giấu dữ liệu), đó là quá trình che giấu tất cả các bí mật của một đối tượng không đóng góp vào các đặc điểm thiết yếu của nó; thông thường, cấu trúc của một đối tượng bị ẩn, cũng như việc thực hiện các phương thức của nó.


5

Tạo một lớp bao gồm khái niệm đóng gói. Khi bạn tạo một lớp, bạn đặt dữ liệu và hành vi bên trong lớp và lớp trở thành một đơn vị mà chúng ta gọi là một đối tượng. Vì vậy, ẩn dữ liệu là một phần của đóng gói.


4

Từ Wikipedia :

Trong ngôn ngữ lập trình, đóng gói được sử dụng để chỉ một trong hai khái niệm liên quan nhưng khác biệt và đôi khi là sự kết hợp của chúng:

  • Một cơ chế ngôn ngữ để hạn chế quyền truy cập vào một số thành phần của đối tượng.
  • Một cấu trúc ngôn ngữ tạo điều kiện cho việc bó dữ liệu với các phương thức (hoặc các chức năng khác) hoạt động trên dữ liệu đó.

Một số nhà nghiên cứu và học giả ngôn ngữ lập trình sử dụng nghĩa đầu tiên một mình hoặc kết hợp với nghĩa thứ hai như một đặc điểm phân biệt của lập trình hướng đối tượng, trong khi các ngôn ngữ lập trình khác cung cấp đóng cửa từ vựng xem đóng gói như một tính năng của ngôn ngữ trực giao với hướng đối tượng.

Định nghĩa thứ hai được thúc đẩy bởi thực tế là trong nhiều ngôn ngữ OOP, việc ẩn các thành phần không tự động hoặc có thể bị ghi đè; do đó, ẩn thông tin được định nghĩa là một khái niệm riêng biệt bởi những người thích định nghĩa thứ hai.


Cảm ơn vì đã trả lời. Câu hỏi tiếp theo: 1) ngôn ngữ lập trình java có các phương tiện mà khái niệm thứ hai liên quan đến đóng gói đề cập đến không? 2) Tôi không hiểu tại sao ghi đè các vấn đề ẩn dữ liệu. Ví dụ, trong java, bạn có thể truy cập bất kỳ trường nào (công khai hoặc riêng tư) thông qua sự phản chiếu.
dhblah

@Software Engeneering Learner: các lớp như các cấu trúc mã nguồn đại diện cho khái niệm thứ hai. Đối với việc che giấu thông tin, vấn đề là việc giới hạn phạm vi dữ liệu thường dựa trên các cơ chế ngôn ngữ cụ thể và riêng biệt.
Michael Borgwardt

2

Chúng thường được sử dụng thay thế cho nhau trong thảo luận và tôi thường nghĩ rằng chúng phối hợp với nhau để đạt được cùng một mục đích và trong khi những điều sau đây có thể không hoàn toàn chính xác, nó có thể cung cấp một số khác biệt có ý nghĩa, nếu cần phải phân biệt:

Khi nói về đóng gói, thường nó được thực hiện như một cơ chế thủ tục / chức năng. Có một số loại bảo vệ cho trạng thái cơ bản và truy cập thông qua bảo vệ yêu cầu các giao thức nhất định phải được tuân theo để được cấp quyền truy cập (đọc hoặc thay đổi trạng thái mong muốn). Đóng gói cũng cung cấp cơ hội cho các tác dụng phụ xảy ra do truy cập (như thay đổi trạng thái xếp tầng hoặc thông báo / tăng sự kiện / phát tín hiệu khi điều quan tâm được đọc hoặc thay đổi) để có thể bắt đầu các hành động tiếp theo. Một lần nữa, tôi thường nghĩ đóng gói như một khái niệm là một cái gì đó được thực hiện như một thủ tục.

Tôi thấy khái niệm ẩn dữ liệu tương tự như mục đích đóng gói; tuy nhiên, cơ chế là cấu trúc và hoạt động ở một cấp độ khác nhau. Trong thực tế, thay vì cung cấp một cơ chế bảo vệ và tác dụng phụ thông qua thủ tục, trạng thái được bảo vệ và ảnh hưởng thông qua các cơ chế cấu trúc của ngôn ngữ và thời gian chạy. Những loại bảo vệ này sẽ là các mệnh đề về tầm nhìn, định nghĩa kiểu, tính kế thừa và những thứ tương tự. Các tác dụng phụ mà bạn có thể tận dụng từ các đối tượng được bảo vệ có cấu trúc lại là một thứ gì đó phụ thuộc vào ngôn ngữ và thời gian chạy: có thể kích hoạt đối tượng, số tham chiếu hoặc một cái gì đó dọc theo các dòng đó.


0

Chúng thường, có thể thường, được sử dụng thay thế cho nhau. Nhưng lưu ý trích dẫn Booch ở trên có nội dung: "Đóng gói thường đạt được thông qua việc che giấu thông tin ..." tức là thường xuyên nhất, nhưng không phải lúc nào cũng trong mọi trường hợp.

Lưu ý rằng Python cho phép cuộn dữ liệu lên trong các lớp, nhưng không cho phép các biến riêng tư. Vì vậy, có thể nói rằng Python cung cấp đóng gói mà không ẩn dữ liệu.

Bạn có thể làm điều tương tự trong Java bằng cách tạo tất cả các biến thành viên của mình public, nhưng ngoài việc khiến mọi người đau tim, bạn sẽ mất đi lợi ích của việc che giấu dữ liệu ... tức là bảo tồn ngữ nghĩa của một đối tượng bằng cách hạn chế quyền truy cập vào trạng thái của nó.


0

Trong OO, Encapsulation là nơi thông tin được lưu giữ trong một Đối tượng. Ví dụ: a Personcó một namevà khách hàng của Person (tức là bạn) biết rằng Person giữ một tên, thông qua các trường công khai hoặc các phương thức truy cập. Và, hy vọng, bạn cũng không cần phải giữ tên trong một số tên toàn cầu, v.v ... Vì vậy, đây là một bước lớn để tránh mã spaghetti không thể quản lý được. Nhưng khách hàng vẫn cần biết điều gì đó về cách Person xử lý tên: ví dụ: dấu cách hoặc dấu phẩy được phân cách?

Ẩn dữ liệu là nơi Personcó một trường tên, nhưng, ít nhất là trên lý thuyết, không ai biết . Trường này là riêng tư không có phương thức truy cập công cộng. Khách hàng có thể chuyển tên từ bản ghi cơ sở dữ liệu, XML, HTTP POST, bất cứ điều gì, nhưng hoạt động bên trong về cách Person xử lý tên là một "hộp đen". Việc triển khai Person trong tương lai có thể tự do thay đổi, ví dụ, để chuyển sang có a firstNamevà a lastName.

Trong một thế giới lý tưởng, Ẩn dữ liệu vượt trội hơn so với Đóng gói, nhưng không phải tất cả các thế giới đều lý tưởng. :-)

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.