Đóng gói vs Trừu tượng?


137

Dưới đây là các định nghĩa ngắn gọn về đóng gói và trừu tượng.

Trừu tượng:

Quá trình trừu tượng hóa trong Java được sử dụng để ẩn các chi tiết nhất định và chỉ hiển thị các tính năng thiết yếu của đối tượng. Nói cách khác, nó liên quan đến khung nhìn bên ngoài của một đối tượng (giao diện). Ví dụ tốt duy nhất tôi thấy cho điều này trên các trang web khác nhau là giao diện.

Đóng gói:

Về cơ bản, về việc che giấu trạng thái của đối tượng với sự trợ giúp của các sửa đổi như riêng tư, công khai, được bảo vệ, v.v. chúng tôi chỉ đưa ra các phương thức công khai thông qua trạng thái công khai nếu có yêu cầu.

Những gì chúng ta đạt được với các sửa đổi như private, publiccũng che giấu các chi tiết không cần thiết từ thế giới bên ngoài, không có gì ngoài một khái niệm trừu tượng

Vì vậy, từ lời giải thích trên có vẻ như đóng gói là một phần của sự trừu tượng hoặc chúng ta có thể nói nó là một tập hợp trừu tượng. Nhưng tại sao sau đó thuật ngữ đóng gói được phát minh khi chúng ta chỉ có thể giải quyết nó với sự trừu tượng hóa? Tôi chắc chắn sẽ có một số khác biệt lớn để phân biệt chúng nhưng hầu hết các tài liệu trên mạng nói gần như giống nhau cho cả hai.

Mặc dù câu hỏi này đã được đưa ra trên diễn đàn này sớm hơn nhưng tôi đang đăng lại nó với những nghi ngờ cụ thể. Một số trả lời cũng cho biết trừu tượng là một khái niệm và đóng gói là thực hiện. Nhưng tôi không mua cái này - Nếu nó là sự thật, thì tôi có thể nghĩ hai khái niệm khác nhau này được cung cấp để gây nhầm lẫn cho chúng tôi.

Cập nhật: - Sau 5 năm tôi đã đưa ra câu trả lời của riêng mình, đó là ý chính dựa trên câu trả lời trong bài này và những câu dưới đây

  1. sự khác biệt giữa trừu tượng và đóng gói?
  2. đóng gói và trừu tượng ví dụ thế giới thực

đóng gói như được định nghĩa ở trên là một công cụ trừu tượng, tuy nhiên tôi có xu hướng nghĩ về nó như những gì một lớp đóng gói (chức năng / dữ liệu bất kể truy cập) trong khi sự trừu tượng hóa có ý nghĩa loại bỏ bạn khỏi những lo ngại về việc triển khai cụ thể, bất kể làm thế nào nó đã được thực hiện và những gì chính xác được thực hiện nó có thể thực hiện được từ wikipediaAn 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI

Đóng gói là ràng buộc nhiều hơn các chi tiết có liên quan (dữ liệu và hành vi hoạt động trên dữ liệu) liên quan đến bối cảnh. Nó cũng có thể đạt được với các chỉ định truy cập bên ngoài như private public, vì chúng chỉ cung cấp ẩn thông tin / dữ liệu mà chúng tôi thực hiện vì đó là một cách thực hành tốt để bảo vệ dữ liệu của cá thể.
dùng3227986

Câu trả lời:


98

Đóng gói là một chiến lược được sử dụng như một phần của sự trừu tượng hóa. Đóng gói đề cập đến trạng thái của các đối tượng - các đối tượng gói gọn trạng thái của chúng và ẩn nó khỏi bên ngoài; người dùng bên ngoài của lớp tương tác với nó thông qua các phương thức của nó, nhưng không thể truy cập trực tiếp vào trạng thái của lớp. Vì vậy, lớp trừu tượng đi các chi tiết thực hiện liên quan đến trạng thái của nó.

Trừu tượng là một thuật ngữ chung chung hơn, nó cũng có thể đạt được bằng cách (trong số những người khác) phân lớp. Ví dụ, giao diện Listtrong thư viện chuẩn là một bản tóm tắt cho một chuỗi các mục, được lập chỉ mục theo vị trí của chúng, các ví dụ cụ thể của a Listlà một ArrayListhoặc a LinkedList. Mã tương tác với một Listbản tóm tắt về chi tiết loại danh sách mà nó đang sử dụng.

Sự trừu tượng thường không thể thực hiện được nếu không che giấu trạng thái cơ bản bằng cách đóng gói - nếu một lớp phơi bày trạng thái bên trong của nó, nó không thể thay đổi hoạt động bên trong của nó và do đó không thể được trừu tượng hóa.


8
Đóng gói có nghĩa là một nhóm các thuộc tính, phương thức và các thành viên khác được coi là một đơn vị hoặc đối tượng. msdn.microsoft.com/en-us/l
Library / dd460654.aspx

1
Đóng gói dẫn đến Trừu tượng.
Martin

124

Trừu tượng là khái niệm mô tả một cái gì đó bằng các thuật ngữ đơn giản hơn, tức là trừu tượng hóa các chi tiết, để tập trung vào những gì quan trọng (ví dụ, điều này cũng được thấy trong nghệ thuật trừu tượng, nơi nghệ sĩ tập trung vào các khối hình ảnh, chẳng hạn như màu sắc hoặc hình dạng). Ý tưởng tương tự chuyển thành OOP bằng cách sử dụng hệ thống phân cấp thừa kế, trong đó các khái niệm trừu tượng hơn nằm ở trên cùng và các ý tưởng cụ thể hơn, ở phía dưới, dựa trên sự trừu tượng của chúng. Ở mức độ trừu tượng nhất của nó, không có chi tiết thực hiện nào cả và có lẽ rất ít điểm tương đồng, được thêm vào khi sự trừu tượng giảm đi.

Ví dụ, ở trên cùng có thể là một giao diện với một phương thức duy nhất, sau đó là cấp tiếp theo, cung cấp một số lớp trừu tượng, có thể hoặc không thể điền vào một số chi tiết về cấp cao nhất, nhưng các nhánh bằng cách thêm các phương thức trừu tượng của riêng chúng , sau đó đối với mỗi lớp trừu tượng này là các lớp cụ thể cung cấp việc triển khai tất cả các phương thức còn lại.

Đóng gói là một kỹ thuật . Nó có thể hoặc không thể hỗ trợ cho sự trừu tượng, nhưng nó chắc chắn là về việc che giấu thông tin và / hoặc tổ chức. Nó đòi hỏi dữ liệu và các chức năng được nhóm lại theo một cách nào đó - tất nhiên là thực hành OOP tốt đòi hỏi chúng phải được nhóm lại bằng cách trừu tượng hóa. Tuy nhiên, có những cách sử dụng khác chỉ giúp duy trì khả năng bảo trì, v.v.


13
Định nghĩa của bạn về Trừu tượng là điều tốt nhất tôi từng thấy, và tôi cảm thấy như lần đầu tiên, nó thực sự nhấp vào đầu tôi và có ý nghĩa. Tôi biết đã hơn 3 năm kể từ khi bạn đăng bài này, nhưng cảm ơn bạn.
Casey Crookston

1
Wow .... Trừu tượng .... thể hiện ở khía cạnh nghệ thuật ... màu đỏ có thể là sự tức giận, đó là tất cả những gì chúng ta cần biết! Cảm ơn bạn đã xem khái niệm này :-)
SlowLearner

Đóng gói được sử dụng để đạt được "Khớp nối lỏng lẻo & độ kết dính cao."
Sắp xếp

28

đóng gói là một phần của trừu tượng hóa hoặc chúng ta có thể nói nó là một tập hợp trừu tượng

Chúng là những khái niệm khác nhau.

  • Trừu tượng là quá trình tinh chỉnh tất cả các thuộc tính không cần thiết / không quan trọng của một đối tượng và chỉ giữ các đặc điểm phù hợp nhất cho miền của bạn.

    Ví dụ: đối với một người: bạn quyết định giữ tên và họ và SSN. Tuổi, chiều cao, cân nặng vv được bỏ qua là không liên quan.

    Trừu tượng là nơi thiết kế của bạn bắt đầu.

  • Đóng gói là bước tiếp theo nơi nó nhận ra các hoạt động phù hợp với các thuộc tính bạn đã chấp nhận để giữ trong quá trình trừu tượng hóa. Đó là sự kết hợp của dữ liệu với hoạt động tác động lên chúng.
    Dữ liệu và phương pháp được gói lại với nhau.

Chúng ta có thể nói Trừu tượng là một loại khái niệm thiết kế và Đóng gói chủ yếu liên quan đến việc thực hiện thiết kế mà chúng ta đã thỏa thuận trong quá trình trừu tượng hóa?
M Sach

1
Trong đóng gói, bạn xác định các hoạt động có thể / phải được áp dụng cho dữ liệu của mình. Đây cũng có thể là một phần của thiết kế. Hãy truy xuất SSN, nhưng không sửa đổi nó
Cratylus

25

Đóng gói là ẩn dữ liệu không cần thiết trong một viên nang hoặc đơn vị

Trừu tượng đang hiển thị tính năng thiết yếu của một đối tượng

Encapsulation được sử dụng để ẩn thành viên của nó khỏi lớp và giao diện bên ngoài. Sử dụng các công cụ sửa đổi truy cập được cung cấp trong c # .like công khai, riêng tư, được bảo vệ, v.v.

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Ở đây chúng tôi có gói dữ liệu trong một đơn vị hoặc viên nang tức là Class.

Trừu tượng chỉ là đối nghịch với Đóng gói.

Trừu tượng được sử dụng để hiển thị dữ liệu quan trọng và có liên quan đến người dùng. ví dụ tốt nhất trong thế giới thực Trong điện thoại di động, bạn thấy các loại chức năng khác nhau của chúng như máy ảnh, máy nghe nhạc mp3, chức năng gọi điện, chức năng ghi âm, đa phương tiện, v.v ... Đó là sự trừu tượng, bởi vì bạn chỉ nhìn thấy thông tin liên quan thay vì kỹ thuật bên trong của chúng.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }

tôi đồng ý. Những kẻ này là đối lập nhau. oop tốt có xu hướng trừu tượng hóa những thứ không thay đổi và [gói gọn những điều làm thay đổi] [1]. [1]: Nguyên tắc
wiki.net / Từ

15

Trừu tượng là một thuật ngữ rất chung chung và sự trừu tượng hóa trong phần mềm không giới hạn ở các ngôn ngữ hướng đối tượng. Một định nghĩa từ điển: "hành động coi một cái gì đó là chất lượng hoặc đặc tính chung, ngoài thực tế cụ thể, các đối tượng cụ thể hoặc các trường hợp thực tế".

Ngôn ngữ hội có thể được coi là sự trừu tượng của mã máy - lắp ráp thể hiện các chi tiết và cấu trúc thiết yếu của mã máy, nhưng giải phóng bạn khỏi phải suy nghĩ về các opcode được sử dụng, cách bố trí mã trong bộ nhớ, thực hiện các bước nhảy đúng địa chỉ, v.v.

API của hệ điều hành của bạn là một bản tóm tắt của máy bên dưới. Trình biên dịch của bạn cung cấp một lớp trừu tượng bảo vệ bạn khỏi các chi tiết của ngôn ngữ lắp ráp. Ngăn xếp TCP / IP được tích hợp trong hệ điều hành của bạn trừu tượng hóa các chi tiết truyền bit qua mạng. Nếu bạn đi xuống tận silicon nguyên, những người thiết kế CPU của bạn đã sử dụng sơ đồ mạch được viết dưới dạng "điốt" và "bóng bán dẫn", đó là sự trừu tượng về cách các electron di chuyển qua các tinh thể bán dẫn.

Trong phần mềm, mọi thứ đều là một sự trừu tượng. Chúng tôi xây dựng các chương trình mô phỏng hoặc mô hình hóa một số khía cạnh của thực tế, nhưng do sự cần thiết, các mô hình của chúng tôi luôn trừu tượng hóa một số chi tiết của "thực tế". Chúng tôi xây dựng lớp trên lớp trên lớp trừu tượng, bởi vì đó là cách duy nhất chúng tôi hoàn thành mọi thứ. (Hãy tưởng tượng bạn đang cố gắng tạo ra một bộ giải sudoku và bạn phải thiết kế nó chỉ bằng các tinh thể bán dẫn. "OK, tôi cần một miếng silicon loại N ở đây ...")

Trong so sánh, "đóng gói" là một thuật ngữ rất cụ thể và hạn chế. Một số câu trả lời khác cho câu hỏi này đã đưa ra định nghĩa tốt cho nó.


14

Trả lời câu hỏi của riêng tôi sau 5 năm vì tôi cảm thấy nó vẫn cần thêm chi tiết

Trừu tượng:

Định nghĩa kỹ thuật: - Trừu tượng là một khái niệm để ẩn các chi tiết không cần thiết (phức tạp hoặc đơn giản) và chỉ hiển thị các tính năng thiết yếu của đối tượng. Không có triển khai ở đây nó chỉ là một khái niệm

Ý nghĩa thực tế của nó: - Khi tôi nói công ty của tôi cần một số phương tiện / thiết bị để nhân viên có thể kết nối với khách hàng. Đây là hình thức tiết chế thuần túy nhất (như giao diện trong java) vì thiết bị / phương tiện đó có thể là điện thoại hoặc internet hoặc skype hoặc trực tiếp hoặc email, v.v. Tôi không đi sâu vào thiết bị / phương tiện

Ngay cả khi tôi nói rằng công ty của tôi cần một số phương tiện / thiết bị để nhân viên có thể kết nối với khách hàng thông qua cuộc gọi thoại. Sau đó, tôi cũng đang nói chuyện trừu tượng nhưng ở cấp độ thấp hơn một chút vì thiết bị / phương tiện có thể là điện thoại hoặc skype hoặc những thứ khác, v.v.

Bây giờ khi tôi nói công ty của tôi cần một số điện thoại để nhân viên có thể kết nối với khách hàng thông qua cuộc gọi thoại. Sau đó, tôi cũng đang nói chuyện trừu tượng nhưng ở cấp độ thấp hơn một chút vì điện thoại có thể là của bất kỳ công ty nào như iphone hoặc samsung hoặc nokia, v.v.

Đóng gói: - Về cơ bản là về việc ẩn trạng thái (thông tin) của đối tượng với sự trợ giúp của các công cụ sửa đổi như riêng tư, công cộng, được bảo vệ, v.v. chúng tôi chỉ đưa ra các phương thức công khai thông qua nhà nước nếu có yêu cầu.

Thực tế nó có nghĩa là gì: - Bây giờ khi tôi nói công ty của tôi cần một số iphone để nhân viên có thể kết nối với khách hàng thông qua cuộc gọi thoại. Bây giờ tôi đang nói về một số đối tượng cụ thể (như iphone). Mặc dù tôi cũng không đi sâu vào quá nhiều về iphone ở đây nhưng iphone có một số thông tin / triển khai đồng bộ / liên quan đến nó mà thiết bị / phương tiện không có. Khi tôi nói đối tượng cụ thể, thực sự nó có nghĩa là bất kỳ đối tượng nào có một số (không hoàn thành như lớp trừu tượng java) liên quan đến nó.

Vì vậy, iphone thực sự được sử dụng ở đây đóng gói như một chiến lược để che giấu trạng thái / thông tin của nó và chỉ phơi bày những thứ mà nó nghĩ nên được phơi bày. Vì vậy, cả trừu tượng hóa và đóng gói đều ẩn giấu một số chi tiết không cần thiết nhưng trừu tượng hóa ở cấp độ khái niệm và đóng gói thực sự ở cấp độ thực thi

Đây là ý chính dựa trên câu trả lời trong bài này và dưới đây

  1. sự khác biệt giữa trừu tượng và đóng gói?
  2. đóng gói và trừu tượng ví dụ thế giới thực

5

Đóng gói - quá trình ẩn các thành phần của lớp để ngăn chặn truy cập trực tiếp từ bên ngoài. Nó đạt được bằng cách sử dụng công cụ sửa đổi "riêng tư" để ngăn truy cập trực tiếp vào một số thành viên lớp (trường dữ liệu hoặc phương thức) từ các lớp hoặc đối tượng khác trong khi cung cấp quyền truy cập cho các thành viên riêng này bởi các thành viên công cộng (Giao diện). Điều đó làm cho các thành viên trong lớp được bảo vệ như các bộ phận cơ thể người được giấu / gói gọn dưới da hoặc một số lá chắn.

Trừu tượng hóa - Một nguyên tắc phải được tuân theo khi viết chương trình OOP có nội dung "bạn phải bao gồm trong lớp chỉ các thành phần thú vị trong nhiệm vụ của chương trình". Ví dụ: học sinh đối tượng có rất nhiều nhân vật như con người: tên, tuổi, cân nặng, màu tóc, màu mắt, v.v. Nhưng, khi bạn tạo một lớp trong OOP để làm việc với học sinh, bạn chỉ nên bao gồm những nhân vật thực sự vấn đề đối với cơ sở dữ liệu sinh viên: tên, tuổi, chuyên môn, cấp độ, nhãn hiệu, v.v. trong C ++, bạn có thể tạo lớp trừu tượng bằng cách sử dụng công cụ sửa đổi "ảo" với bất kỳ phương thức nào trong lớp và điều đó sẽ khiến nó không thể sử dụng trực tiếp nhưng bạn có thể lấy các lớp khác từ nó và tạo triển khai cho các thành viên của nó bằng cách thêm các thành viên cần thiết dựa trên nhiệm vụ.


4

Đây là cách tôi hiểu nó:

Trong lập trình hướng đối tượng, chúng ta có một thứ gọi là các lớp . Họ để làm gì? Họ phải lưu trữ một số trạng thái và lưu trữ một số phương thức để thay đổi trạng thái đó, tức là họ đang đóng gói trạng thái và các phương thức của nó.

Nó (lớp) không quan tâm đến khả năng hiển thị của chính nó hoặc của nội dung của nó. Nếu chúng ta chọn ẩn trạng thái hoặc một số phương thức, đó là ẩn thông tin .

Bây giờ, lấy kịch bản của một thừa kế . Chúng tôi có một lớp cơ sở và một vài lớp dẫn xuất (kế thừa). Vậy, lớp cơ sở đang làm gì ở đây? Đó là trừu tượng hóa một số điều từ các lớp dẫn xuất.

Tất cả đều khác nhau, phải không? Nhưng, chúng tôi trộn chúng lên để viết các chương trình hướng đối tượng tốt. Hy vọng nó giúp :)


3

Trừu tượng mô tả một đại diện cụ thể, đơn giản hóa theo ngữ cảnh của một cái gì đó; nó bỏ qua các chi tiết không liên quan theo ngữ cảnh và bao gồm các chi tiết quan trọng theo ngữ cảnh.

Đóng gói hạn chế quyền truy cập bên ngoài vào các bộ phận của một cái gì đó và bó trạng thái đó với các thủ tục sử dụng trạng thái.


Lấy người làm ví dụ. Trong bối cảnh phẫu thuật, một sự trừu tượng hữu ích bỏ qua niềm tin tôn giáo của một người và bao gồm cả cơ thể của người đó. Hơn nữa, mọi người gói gọn ký ức của họ với các quá trình suy nghĩ sử dụng những ký ức đó. Một sự trừu tượng không cần phải đóng gói; ví dụ, một bức tranh của một người không che giấu các bộ phận của nó cũng không bó các thủ tục với trạng thái của nó. Và, đóng gói không cần phải có một sự trừu tượng hóa liên quan; ví dụ, người thật (không phải người trừu tượng) gói gọn các cơ quan của họ bằng quá trình trao đổi chất.


1

LƯU Ý: Tôi đang chia sẻ điều này. Điều đó không có nghĩa là ở đây không phải là câu trả lời hay mà vì tôi dễ hiểu.

Câu trả lời:

Khi một lớp được khái niệm hóa, các thuộc tính chúng ta có thể có trong bối cảnh đó là gì. Nếu chúng ta đang thiết kế một lớp Động vật trong bối cảnh của một sở thú, điều quan trọng là chúng ta có một thuộc tính là AnimalType để mô tả trong nước hoặc hoang dã. Thuộc tính này có thể không có ý nghĩa khi chúng ta thiết kế lớp trong một bối cảnh khác.

Tương tự, những hành vi chúng ta sẽ có trong lớp là gì? Trừu tượng cũng được áp dụng ở đây. Điều gì là cần thiết để có ở đây và những gì sẽ là quá liều? Sau đó chúng tôi cắt bỏ một số thông tin từ lớp học. Quá trình này đang áp dụng trừu tượng.

Khi chúng ta yêu cầu sự khác biệt giữa đóng gói và trừu tượng, tôi sẽ nói, đóng gói sử dụng sự trừu tượng hóa như một khái niệm. Vì vậy, sau đó, nó chỉ đóng gói. Không, trừu tượng thậm chí là một khái niệm được áp dụng như một phần của kế thừa và đa hình.

Tới đây để giải thích thêm về chủ đề này.


1

Hãy cố gắng hiểu theo một cách khác.

Điều gì có thể xảy ra nếu Trừu tượng không có ở đó và Điều gì có thể xảy ra nếu Đóng gói không có ở đó.

Nếu Trừu tượng không có, thì bạn có thể nói đối tượng đang sử dụng ít hơn. Bạn không thể xác định đối tượng cũng như không thể truy cập bất kỳ chức năng nào của nó. Lấy một ví dụ về TV, nếu bạn không có tùy chọn bật nguồn, thay đổi kênh, tăng hoặc giảm âm lượng, v.v. thì việc sử dụng TV là gì và bạn sử dụng nó như thế nào?

Nếu Encapsulation không có hoặc không được thực hiện đúng cách, thì bạn có thể sử dụng sai đối tượng. Ở đó bởi dữ liệu / thành phần có thể bị lạm dụng. Lấy ví dụ tương tự về TV, Nếu không có đóng gói được thực hiện cho âm lượng của TV, thì bộ điều khiển âm lượng có thể bị sử dụng sai bằng cách đặt nó ở dưới hoặc vượt quá giới hạn của nó (0-40 / 50).


1

Đóng gói bảo vệ để thu gọn hành vi bên trong của đối tượng / thể hiện từ thực thể bên ngoài. Vì vậy, cần phải cung cấp một điều khiển để xác nhận rằng dữ liệu đang được cung cấp sẽ không gây hại cho hệ thống bên trong của đối tượng / đối tượng để tồn tại.

Ví dụ hay, Divider là một lớp có hai cổ tức và số chia biến thể hiện và một phương thức getDividedValue.

Bạn có thể nghĩ, nếu số chia được đặt thành 0 thì hệ thống / hành vi nội bộ (getDivided) sẽ bị hỏng.

Vì vậy, hành vi bên trong đối tượng có thể được bảo vệ bằng cách ném ngoại lệ thông qua một phương thức.


0

Trong một câu đơn giản, tôi cay nói: Bản chất của sự trừu tượng là trích xuất các thuộc tính thiết yếu trong khi bỏ qua các chi tiết không cần thiết. Nhưng tại sao chúng ta nên bỏ qua các chi tiết không cần thiết? Động lực chính là ngăn chặn nguy cơ thay đổi. Bạn có thể coi sự trừu tượng cũng giống như đóng gói. Nhưng đóng gói có nghĩa là hành động bao quanh một hoặc nhiều vật phẩm trong một container, không che giấu chi tiết. Nếu bạn đưa ra lập luận rằng "mọi thứ được gói gọn cũng bị ẩn đi". Điều này rõ ràng là không đúng sự thật. Ví dụ, mặc dù thông tin có thể được gói gọn trong các cấu trúc và mảng bản ghi, thông tin này thường không bị ẩn (trừ khi được ẩn qua một số cơ chế khác).

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.