Sự khác biệt giữa đóng gói và trừu tượng


83

Tôi đã có một cuộc phỏng vấn ngày hôm nay. Tôi có một câu hỏi từ OOP , về sự khác biệt giữa EncapsulationAbstraction ?

Tôi đã trả lời cô ấy về kiến ​​thức của tôi rằng Encapsulation về cơ bản là liên kết các thành viên dữ liệu và các hàm thành viên thành một đơn vị duy nhất được gọi là Lớp . Trong khi Tóm tắt về cơ bản là để che giấu sự phức tạp của việc triển khai và cung cấp sự dễ dàng truy cập cho người dùng. Tôi nghĩ cô ấy sẽ ổn với câu trả lời của tôi. Nhưng cô ấy đặt câu hỏi, nếu mục đích của cả hai là để che giấu thông tin thì sự khác biệt thực sự giữa hai điều này là gì? Tôi không thể đưa ra bất kỳ câu trả lời nào cho cô ấy.

Trước khi đặt câu hỏi này, tôi đã đọc các chủ đề khác trên StackOverFlow về sự khác biệt giữa hai khái niệm OOP này . Nhưng tôi không thấy mình ở vị trí nào để thuyết phục người phỏng vấn.

Bất cứ ai có thể vui lòng giải thích nó bằng một ví dụ đơn giản nhất?


11
và cuối cùng, bạn đã nhận được công việc chưa? :)
Adrian Księżarczyk

1
@WPFbee Thật không may!
Aimal Khan

3
Tôi không biết tại sao mọi người lại so sánh trừu tượng và đóng gói. Tại sao chúng ta không thể chấp nhận chúng là hai khái niệm OOP khác nhau.
Mr ASquare


@WpfBee trừu tượng không có gì để làm với ẩn, Chỉ cần kiểm trả lời của tôi
S Vinesh

Câu trả lời:


71

Đóng gói ẩn các biến hoặc một số triển khai có thể được thay đổi thường xuyên trong một lớp để ngăn người ngoài truy cập trực tiếp. Họ phải truy cập nó thông qua phương thức getter và setter.

Tính trừu tượng cũng được sử dụng để ẩn một cái gì đó nhưng ở mức độ cao hơn (lớp, giao diện) . Khách hàng sử dụng một lớp trừu tượng (hoặc giao diện) không quan tâm đến việc đó là ai hay nó là gì, họ chỉ cần biết nó có thể làm gì.


6
Hoàn hảo. Đối với tôi, dường như câu trả lời của bạn chỉ nhắm vào câu hỏi của người phỏng vấn tôi. Tôi đang cố gắng lặp lại câu trả lời của bạn với một ví dụ thực tế. Vui lòng cho tôi biết, nếu nó phù hợp với câu trả lời của bạn. Chúng ta hãy lấy một ví dụ về truyền hình. Đóng gói là các mạch bên trong, LEDS, v.v. kết hợp để biến nó thành TV. Tính trừu tượng là bật-tắt, âm thanh, cài đặt kênh và các nút khác được cung cấp để vận hành nó.
WpfBee

Guys trừu tượng không có gì để làm với thực hiện lẩn trốn ... trừu tượng là một phương pháp để tương tác polymorphicly với một lớp
Mortalus

1
@Mortalus - Tôi không đồng ý tuyên bố đầu tiên của bạn "trừu tượng không liên quan gì đến việc ẩn triển khai". Tôi nghĩ, khi chúng ta bắt đầu học khái niệm Trừu tượng, điều đầu tiên mà chúng ta được dạy là chúng ta che giấu sự phức tạp của việc triển khai và cung cấp một số giao diện cho người dùng sử dụng nó. Bởi vì người dùng có thể không quan tâm đến độ phức tạp của việc triển khai. Bạn có thể lấy một ví dụ thực tế về TV hoặc AC. Một điều khác là nếu nó không ẩn việc thực thi thì tại sao chúng ta lại cung cấp một phương thức trong lớp trừu tượng không có phần thân. Chúng tôi rõ ràng đang ẩn việc triển khai ở đây.
WpfBee

1
@Mortalus - Ngoài ra, bạn đã đề cập đến một liên kết wiki. Đó là phát biểu đầu tiên - "Trong khoa học máy tính, trừu tượng hóa là quá trình mà dữ liệu và chương trình được xác định với hình thức tương tự như ý nghĩa của nó (ngữ nghĩa), đồng thời ẩn đi các chi tiết triển khai. Trừu tượng hóa cố gắng giảm bớt và phân tích các chi tiết sao cho lập trình viên có thể tập trung vào một vài khái niệm tại một thời điểm. " chính nó gợi ý rằng Trừu tượng nhằm che giấu việc thực hiện. Tôi đồng ý với tuyên bố thứ 2 của bạn nhưng không đồng ý với câu thứ nhất.
WpfBee

1
Tôi nghĩ rằng Encapsulation chỉ là xây dựng một đơn vị duy nhất, nó không liên quan nhiều đến việc bạn ẩn nó hay không. Vì phần Trừu tượng thiên về việc che giấu mọi thứ, vui lòng sửa nếu tôi sai.
raj240 19/09/19


12

Tính trừu tượng - là quá trình (và kết quả của quá trình này) xác định các đặc điểm thiết yếu chung cho một tập hợp các đối tượng. Người ta có thể nói rằng Trừu tượng hóa là quá trình tổng quát hóa: tất cả các đối tượng đang được xem xét đều được bao gồm trong một tập siêu các đối tượng, tất cả đều sở hữu các thuộc tính nhất định (nhưng khác nhau ở các khía cạnh khác).

Đóng gói - là quá trình đóng gói dữ liệu và các chức năng thao tác dữ liệu này thành một đơn vị duy nhất, để che giấu việc triển khai bên trong với thế giới bên ngoài.

Đây là câu trả lời chung chung không liên quan đến một ngôn ngữ lập trình cụ thể (như câu hỏi). Vì vậy, câu trả lời là: trừu tượng và đóng gói không có điểm chung. Nhưng việc triển khai của chúng có thể liên quan đến nhau (giả sử trong Java: Đóng gói - chi tiết được ẩn trong một lớp, Trừu tượng - chi tiết hoàn toàn không có trong một lớp hoặc giao diện).


11

Đóng gói: Gói mã và dữ liệu lại với nhau thành một đơn vị duy nhất. Classlà một ví dụ về đóng gói, vì nó bao bọc phương thức và thuộc tính.

Tóm tắt: Ẩn chi tiết nội bộ và chỉ hiển thị chức năng. Tính trừu tượng tập trung vào những gì đối tượng làm thay vì nó làm như thế nào. Nó cung cấp cái nhìn tổng quát về các lớp.

int number = 5;
string aStringNumber = number.ToString(); 

Ở đây, ToString () là trừu tượng. Và cách numberbiến cơ chế này chuyển đổi thành chuỗi và khởi tạo thành aStringNumberlà đóng gói.

Hãy để chúng tôi lấy một ví dụ thực tế về máy tính. Tính đóng gói là các mạch bên trong, pin, v.v., kết hợp với nhau để biến nó thành một máy tính. Trừu tượng là các nút khác nhau như bật-tắt, rõ ràng và các nút khác được cung cấp để vận hành nó.


7

Tính trừu tượng: Thường được thực hiện để cung cấp quyền truy cập đa hình vào một tập hợp các lớp. Một lớp trừu tượng không thể được khởi tạo vì vậy một lớp khác sẽ phải lấy từ nó để tạo ra một biểu diễn cụ thể hơn.

Một ví dụ sử dụng phổ biến của một lớp trừu tượng có thể là việc triển khai một mẫu thiết kế phương thức khuôn mẫu trong đó một điểm tiêm trừu tượng được giới thiệu để lớp cụ thể có thể triển khai nó theo cách "cụ thể" của riêng nó.

xem: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

Đóng gói: Là quá trình che giấu độ phức tạp thực thi của một lớp cụ thể khỏi máy khách sẽ sử dụng nó, hãy nhớ rằng "máy khách" có thể là một chương trình hoặc sự kiện mà người đã viết lớp đó.

xem: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


1
trừu tượng có liên quan đến lớp trừu tượng ??
vishnu viswanath

@vishnuviswanath, vâng, chúng tôi có thể triển khai trừu tượng bằng cách sử dụng lớp và giao diện trừu tượng.
invzbl3

3

Có một bài viết tuyệt vời đề cập đến sự khác biệt giữa Tóm tắt, Đóng gói và Ẩn thông tin: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

Đây là kết luận từ bài báo:

Trừu tượng hóa, ẩn thông tin và đóng gói là những khái niệm rất khác nhau, nhưng có liên quan cao. Người ta có thể tranh luận rằng trừu tượng là một kỹ thuật giúp chúng ta xác định thông tin cụ thể nào nên được hiển thị và thông tin nào nên được ẩn đi. Sau đó, đóng gói là kỹ thuật đóng gói thông tin theo cách để che giấu những gì cần được ẩn và hiển thị những gì được dự định hiển thị.


2

sự khác biệt ở cả hai chỉ là từ View Point
Encapsulation được sử dụng để ẩn dữ liệu nếu mục đích của chúng tôi là ngăn khách hàng nhìn thấy bên trong logic của chúng tôi

Từ trừu tượng được sử dụng để ẩn dữ liệu nếu mục đích của chúng tôi là hiển thị cho khách hàng của chúng tôi một cái nhìn bên ngoài

Chế độ xem bên ngoài có nghĩa là giả sử

BubbleSort(){
//code 
swap(x,y);
}

ở đây chúng tôi sử dụng hoán đổi trong sắp xếp bong bóng để chỉ cho khách hàng của chúng tôi biết chúng tôi đang áp dụng logic nào, Nếu chúng tôi thay thế hoán đổi (x, y) bằng toàn bộ mã ở đây, Trong một trường hợp duy nhất, họ không thể hiểu logic của chúng tôi


2

Đúng vậy, trừu tượng và đóng gói là về ẩn.

  • Chỉ sử dụng các chi tiết có liên quan và ẩn dữ liệu không cần thiết ở Cấp thiết kế được gọi là Trừu tượng hóa . (Giống như chỉ chọn các thuộc tính có liên quan cho một lớp 'Xe' để làm cho nó trở nên trừu tượng hoặc tổng quát hơn.)

  • Đóng gói là việc ẩn dữ liệu ở Mức thực thi . Giống như cách thực sự ẩn dữ liệu khỏi truy cập trực tiếp / bên ngoài. Điều này được thực hiện bằng cách liên kết dữ liệu và phương thức với một thực thể / đơn vị duy nhất để ngăn truy cập từ bên ngoài. Vì vậy, đóng gói còn được gọi là ẩn dữ liệu ở cấp độ thực thi.


3
Bạn có thể giải thích câu trả lời này khác với 12 câu trả lời hiện có khác như thế nào không?
Stephen Rauch

2

Đóng gói:

Giấu thứ gì đó, giống như viên thuốc. Chúng tôi không biết những gì trong viên nang, chúng tôi chỉ lấy nó. Tương tự như trong lập trình - chúng tôi chỉ ẩn một số mã đặc biệt của phương thức hoặc thuộc tính và nó chỉ đưa ra đầu ra, giống như viên nang. Nói tóm lại, đóng gói ẩn dữ liệu.

Tóm tắt:

Trừu tượng có nghĩa là ẩn logic hoặc thực hiện. Ví dụ, chúng tôi uống máy tính bảng và xem màu sắc của chúng nhưng không biết mục đích của việc này là gì và nó hoạt động như thế nào với cơ thể.


0

Trừu tượng

Trong Java, trừu tượng nghĩa là ẩn thông tin ra thế giới thực. Nó thiết lập hợp đồng giữa các bên để nói về “chúng tôi nên làm gì để sử dụng dịch vụ”.

Ví dụ, Trong phát triển API, chỉ có thông tin trừu tượng của dịch vụ được tiết lộ với thế giới chứ không phải là việc triển khai thực tế. Giao diện trong java có thể giúp đạt được khái niệm này rất tốt.

Giao diện cung cấp hợp đồng giữa các bên, ví dụ, nhà sản xuất và người tiêu dùng. Người sản xuất sản xuất hàng hóa mà không cho người tiêu dùng biết sản phẩm đang được tạo ra như thế nào. Tuy nhiên, thông qua giao diện, Producer cho tất cả người tiêu dùng biết sản phẩm có thể mua. Với sự trợ giúp của trừu tượng, nhà sản xuất có thể tiếp thị sản phẩm cho người tiêu dùng của họ.

Đóng gói:

Đóng gói là một cấp độ của trừu tượng. Cùng một công ty sản xuất thử che chắn thông tin từ các nhóm sản xuất khác. Ví dụ, nếu một công ty sản xuất rượu vang và sô cô la, thì việc đóng gói sẽ giúp che chắn thông tin về cách mỗi sản phẩm được làm từ nhau.

  1. Nếu tôi có một gói riêng lẻ cho rượu vang và một gói khác cho sô cô la và nếu tất cả các lớp được khai báo trong gói là công cụ sửa đổi truy cập mặc định, chúng tôi sẽ cung cấp tính năng đóng gói mức gói cho tất cả các lớp.
  2. Trong một gói, nếu chúng ta khai báo mỗi lớp được lưu trữ (trường thành viên) là riêng tư và có một phương thức công khai để truy cập các trường đó, thì theo cách này, việc đóng gói mức lớp cho các trường đó

0

Chỉ cần một vài điểm nữa để làm rõ ràng mọi thứ,

Người ta không được nhầm lẫn giữa trừu tượng hóa dữ liệu và lớp trừu tượng. Họ khác nhau.

Nói chung, chúng tôi nói rằng lớp hoặc phương thức trừu tượng về cơ bản là để ẩn một cái gì đó. Nhưng không .. Điều đó là sai. Từ trừu tượng có nghĩa là gì? Google tìm kiếm cho biết từ trừu tượng trong tiếng Anh có nghĩa là

"Tồn tại trong tư tưởng hoặc như một ý tưởng nhưng không tồn tại vật chất hoặc cụ thể."

Và điều đó cũng đúng trong trường hợp của lớp trừu tượng. Nó không phải là che giấu nội dung của phương pháp mà là nội dung của phương pháp đã trống rỗng (không tồn tại vật chất hoặc cụ thể) nhưng nó xác định phương pháp nên tồn tại như thế nào (tồn tại trong suy nghĩ hoặc dưới dạng ý tưởng) hoặc một phương pháp nên ở trong bể. .

Vậy khi nào bạn thực sự sử dụng các phương thức trừu tượng?

  • Khi một phương thức từ lớp cơ sở sẽ khác nhau trong mỗi lớp con mở rộng nó.
  • Và vì vậy bạn muốn đảm bảo rằng lớp con có chức năng này được triển khai.
  • Điều này cũng đảm bảo rằng phương thức, để có chữ ký bắt buộc như thế, nó phải có n số tham số.

Vì vậy, về lớp trừu tượng! - Một lớp trừu tượng không thể được khởi tạo chỉ được mở rộng! Nhưng tại sao ?

  • Một lớp có phương thức trừu tượng phải được ngăn chặn tạo cá thể của chính nó bởi vì các phương thức trừu tượng trong đó không có bất kỳ triển khai có ý nghĩa nào.
  • Bạn thậm chí có thể tạo một lớp trừu tượng, nếu vì lý do nào đó mà bạn thấy rằng việc có một thể hiện của lớp đó sẽ có ý nghĩa ít hơn.

Một lớp trừu tượng giúp chúng ta tránh tạo ra phiên bản mới của nó!

Một phương thức trừu tượng trong một lớp buộc lớp con phải thực thi chức năng đó một cách chắc chắn với chữ ký được cung cấp!


0

Hãy để tôi giải thích nó với cùng một ví dụ được thảo luận ở trên. Vui lòng xem xét cùng một TV.

Đóng gói : Các điều chỉnh mà chúng tôi có thể thực hiện với điều khiển từ xa là một ví dụ điển hình - Âm lượng LÊN / XUỐNG, Màu sắc & Độ tương phản - Tất cả những gì chúng tôi có thể làm là điều chỉnh nó thành giá trị tối thiểu và tối đa được cung cấp và không thể làm gì ngoài những gì được cung cấp trong điều khiển - Hãy tưởng tượng getter và setter ở đây (Hàm setter sẽ kiểm tra xem giá trị được cung cấp có hợp lệ hay không nếu Có, nó xử lý hoạt động nếu không sẽ không cho phép chúng tôi thực hiện thay đổi - giống như chúng tôi không thể giảm âm lượng vượt quá 0 ngay cả khi chúng tôi nhấn âm lượng xuống nút một trăm lần).

Tính trừu tượng : Chúng ta có thể lấy ví dụ tương tự ở đây nhưng với Mức độ / Ngữ cảnh cao hơn. Nút giảm âm lượng sẽ giảm âm lượng - và đây là thông tin chúng tôi cung cấp cho người dùng và người dùng không biết bộ phát hồng ngoại bên trong điều khiển từ xa hay bộ thu trong TV và quá trình phân tích tín hiệu và bộ vi xử lý tiếp theo kiến trúc bên trong TV. Nói một cách đơn giản là nó không cần thiết trong ngữ cảnh - Chỉ cần cung cấp những gì cần thiết. Người ta có thể dễ dàng liên hệ định nghĩa Sách văn bản ở đây, tức là, ẩn việc triển khai bên trong và chỉ cung cấp những gì nó sẽ làm hơn là cách nó thực hiện điều đó!

Hy vọng nó làm rõ một chút!


0

Nếu tôi là người phải đối mặt với cuộc phỏng vấn, tôi sẽ nói rằng vì sự tóm tắt và đóng gói của quan điểm người dùng cuối là khá giống nhau. Nó không là gì khác ngoài việc che giấu thông tin. Ở góc độ Nhà phát triển phần mềm, Tính trừu tượng giải quyết các vấn đề ở cấp độ thiết kế và Tính đóng gói giải quyết vấn đề ở cấp độ triển khai


0

Tóm lại, Abstractionxảy ra ở cấp lớp bằng cách ẩn việc triển khai và thực hiện một giao diện để có thể tương tác với thể hiện của lớp. Trong khi, Encapsulationđược sử dụng để ẩn thông tin; chẳng hạn, đặt các biến thành viên ở chế độ riêng tư để cấm truy cập trực tiếp và cung cấp các bộ định tuyến và bộ định tuyến cho chúng để truy cập trực tiếp.


-2

Tính trừu tượng: các hàm và biến tối thiểu nên được hiển thị bên ngoài lớp của chúng ta là gì.

Encapsulation: làm thế nào để đạt được yêu cầu này, nghĩa là làm thế nào để thực hiện nó.


Đóng gói không phải là một phương tiện để đạt được sự trừu tượng. Chúng là 2 khái niệm hơi khác nhau nhưng có một liên kết tinh tế.
varsh

tôi nghĩ rằng cả hai không phải là khái niệm khác nhau, bez u có thể đạt được đóng gói với lớp trừu tượng.
K Kishore Kumar Reddy
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.