2013-04-15 22 views
45

Học các khái niệm OOP đặc biệt quan tâm để hiểu trừu tượng và đóng gói theo chiều sâu.Cách đơn giản để hiểu sự đóng gói và trừu tượng

Kiểm tra ra dưới đây đã

Abstraction VS Information Hiding VS Encapsulation

difference between abstraction and encapsulation?

tôi thấy rất khó hiểu những khái niệm mà không có một đoạn mã thực tế và đơn giản ví dụ lớp/mã.

Một trong những đồng nghiệp của tôi nói trừu tượng là gì, nhưng tạo trừu tượng lớp và lớp bình thường để bảo vệ biến thành viên với phạm vi là gọi là Encapsulation.

Có cách nào đơn giản để tôi có thể hiểu và giúp người khác hiểu chính xác chúng là gì, thay vì lặp lại bên dưới?

Abstraction và đóng gói là những khái niệm bổ sung: trừu tượng tập trung vào các hành vi quan sát của một đối tượng ... đó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 được thực hiện thông qua thông tin ẩn , trong đó là quá trình ẩn tất cả các bí mật của đối tượng không đóng góp vào các đặc tính thiết yếu của nó.

+0

Chính xác những gì bạn thấy khó hiểu về mô tả đó? –

+0

BTW, tại sao mọi thứ phải đơn giản? – gdoron

+1

Sự trừu tượng là trừu tượng - nhưng đóng gói không liên quan đến trừu tượng, có nghĩa là để giữ dữ liệu và logic để quản lý dữ liệu này trong cùng một đối tượng (lớp), – Serghei

Trả lời

3

Trừu tượng là quá trình mà bạn "vứt bỏ" chi tiết không cần thiết từ thực thể bạn định chụp/đại diện trong thiết kế của mình và chỉ giữ các thuộc tính của thực thể có liên quan đến miền của bạn.
Ví dụ: để đại diện cho chiếc xe bạn sẽ giữ, ví dụ: mô hình và giá cả, vị trí hiện tại và tốc độ hiện tại và bỏ qua màu sắc và số lượng chỗ ngồi, vv ..

Đóng gói là "ràng buộc" các thuộc tính và thao tác thao tác chúng trong một đơn vị trừu tượng đơn lẻ (cụ thể là một lớp).
Vì vậy, chiếc xe sẽ có accelaratestop rằng thao tác vị trí và tốc độ hiện tại vv

+3

Có vẻ như trừu tượng là một hiểu khái niệm và không có gì đã làm với từ khóa 'abstract' tôi đoán. – Billa

17

Abstraction được che giấu thông tin hay chỉ cung cấp chi tiết cần thiết cho khách hàng.

ví dụ: Phanh xe- Bạn chỉ biết rằng việc nhấn bàn đạp sẽ dừng xe nhưng bạn không cần biết cách hoạt động bên trong xe.

Advantage của Abstraction Ngày mai nếu thay đổi thực hiện phanh từ trống phanh để phanh đĩa, như một khách hàng, bạn không cần phải thay đổi (ví dụ mã của bạn sẽ không thay đổi)

Encapsulation là ràng buộc dữ liệu và hành vi cùng nhau trong một đơn vị duy nhất. Ngoài ra, đây là cơ chế ngôn ngữ để hạn chế quyền truy cập vào một số thành phần (điều này có thể đạt được bằng các công cụ sửa đổi truy cập như riêng tư, được bảo vệ, v.v.)

Ví dụ: Lớp có các thuộc tính (ví dụ: dữ liệu) và các hành vi (i.các phương thức e hoạt động trên dữ liệu đó)

+0

Điều này có nghĩa là chúng ta hiểu khái niệm trừu tượng, thay vì định nghĩa từ khóa 'abstract' cho một phương thức hay một lớp. Chính xác? – Billa

+0

Chính xác. OOP là một triết lý và ngôn ngữ trung lập. – JRR

+0

Một ví dụ điển hình về đóng gói là khi sử dụng Getters và Setters. Bạn gán một giá trị cho một thuộc tính riêng của một cá thể của một lớp (đối tượng) thông qua phương thức Setter (ví dụ 'setName (" john ")' trong đó 'setName (firstName)' là một phương thức công khai có chứa '_firstName = firstName' trong đó '_firstName' là thuộc tính riêng). – Wax

0
public abstract class Draw { 
    public abstract void drawShape(); // this is abstraction. Implementation detail need not to be known. 
    // so we are providing only necessary detail by giving drawShape(); No implementation. Subclass will give detail. 


    private int type; // this variable cannot be set outside of the class. Because it is private. 
    // Binding private instance variable with public setter/getter method is encapsulation 

    public int getType() { 
     return type; 
    } 

    public void setType(int type) { // this is encapsulation. Protecting any value to be set. 
     if (type >= 0 && type <= 3) { 
      this.type = type; 
     } else { 
      System.out.println("We have four types only. Enter value between 0 to 4"); 
      try { 
       throw new MyInvalidValueSetException(); 
      } catch (MyInvalidValueSetException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
} 

Abstraction liên quan đến các phương pháp mà chi tiết triển khai không được biết là một loại thực hiện ẩn.
Encapsulation có liên quan với ràng buộc biến thể với phương thức, một loại dữ liệu ẩn.

+0

Có thể thay đổi giá trị của 'loại' trong trình triển khai hay không, vì lớp trình triển khai sẽ cung cấp việc thực hiện – Billa

+0

@Billa Tôi không hiểu câu hỏi của bạn trong nhận xét. – AmitG

+0

từ lớp bê tông tôi có thể thiết lập hoặc thay đổi một giá trị cho biến 'loại' được định nghĩa trong lớp trừu tượng? Tại sao lớp bê tông không thể thay đổi, vì nó cung cấp việc triển khai thực tế? – Billa

4

Một ví dụ sử dụng C#

//abstraction - exposing only the relevant behavior 
public interface IMakeFire 
{ 
    void LightFire(); 
} 

//encapsulation - hiding things that the rest of the world doesn't need to see 
public class Caveman: IMakeFire 
{ 
    //exposed information 
    public string Name {get;set;} 

    // exposed but unchangeable information 
    public byte Age {get; private set;} 

    //internal i.e hidden object detail. This can be changed freely, the outside world 
    // doesn't know about it 
    private bool CanMakeFire() 
    { 
     return Age >7; 
    } 

    //implementation of a relevant feature 
    public void LightFire() 
    { 
     if (!CanMakeFire()) 
     { 
      throw new UnableToLightFireException("Too young"); 
     } 
     GatherWood(); 
     GetFireStone(); 
     //light the fire 

    } 

    private GatherWood() {}; 
    private GetFireStone(); 
} 

public class PersonWithMatch:IMakeFire 
{ 
     //implementation 
} 

Bất kỳ thượng cổ có thể làm cho một ngọn lửa, bởi vì nó thực hiện các IMakeFire 'tính năng'. Có một nhóm các nhà sản xuất lửa (Danh sách) điều này có nghĩa là cả Caveman và PersonWithMatch đều là những cú đánh hợp lệ.

Điều này có nghĩa rằng

//this method (and class) isn't coupled to a Caveman or a PersonWithMatch 
    // it can work with ANY object implementing IMakeFire 
    public void FireStarter(IMakeFire starter) 
    { 
     starter.LightFire(); 
    } 

Vì vậy, bạn có thể có rất nhiều người thực hiện với nhiều chi tiết (tài sản) và hành vi (phương pháp), nhưng trong trường hợp này điều quan trọng là khả năng của họ để làm cho lửa. Đây là trừu tượng.

Vì thực hiện một đám cháy yêu cầu một số bước (GetWood vv), chúng được ẩn khỏi chế độ xem vì chúng là mối quan tâm bên trong của lớp. Các thượng cổ có nhiều hành vi công cộng khác có thể được gọi bởi thế giới bên ngoài. Nhưng một số chi tiết sẽ luôn bị ẩn vì có liên quan đến nội bộ. Chúng là riêng tư và chỉ tồn tại cho đối tượng, chúng không bao giờ bị lộ ra ngoài. Đây là đóng gói

1

dữ liệu trừu tượng: truy cập vào các thành viên dữ liệu và hàm thành viên của bất kỳ lớp được gọi đơn giản là dữ liệu trừu tượng .....

đóng gói: biến ràng buộc và các chức năng hoặc 1 có thể nói các thành viên dữ liệu hoặc chức năng thành viên tất cả cùng nhau trong một đơn vị duy nhất được gọi là gói dữ liệu ....

115

Abstraction là một quá trình mà bạn chỉ hiển thị chi tiết không cần thiết của đối tượng từ người dùng. Xem xét điện thoại di động của bạn, bạn chỉ cần biết nhấn nút nào để gửi tin nhắn hoặc thực hiện cuộc gọi, Điều gì sẽ xảy ra khi bạn nhấn một nút, cách gửi tin nhắn của bạn, cách cuộc gọi của bạn được kết nối sẽ bị xóa khỏi người dùng.

Đóng gói là quá trình kết hợp dữ liệu và hàm vào một đơn vị được gọi là lớp. Trong Encapsulation, dữ liệu không được truy cập trực tiếp; nó được truy cập thông qua các hàm hiện diện bên trong lớp. Nói cách đơn giản hơn, các thuộc tính của lớp được giữ riêng và các phương thức getter và setter công khai được cung cấp để thao tác các thuộc tính này. Vì vậy, đóng gói làm cho khái niệm về ẩn dữ liệu có thể.

enter image description here

+1

_'... chỉ hiển thị dữ liệu ** "có liên quan" ** và "ẩn" chi tiết không cần thiết ...'_, từ 'dữ liệu' trong phần giải thích trừu tượng có thể hơi lừa dối, vì trừu tượng hơn về trình bày chỉ liên quan các tính năng (chức năng, nếu bạn muốn). Điểm này được sao lưu bằng ví dụ với điện thoại di động và tính năng ** của nó ** –

+0

Hình ảnh được cung cấp mang lại ý tưởng khá hay về những gì là gì, mặc dù =) –

0

dữ liệu trừu tượng: DA chỉ đơn giản là lọc các mục cụ thể. Bởi lớp chúng ta có thể đạt được sự trừu tượng thuần túy, bởi vì trước khi tạo ra lớp, chúng ta chỉ có thể nghĩ về thông tin liên quan đến lớp.

Đóng gói: Đây là cơ chế để bảo vệ dữ liệu của chúng tôi từ bên ngoài.

5

Trừu tượng là thuật ngữ tổng quát. tức là Encapsulation là tập con của Abstraction.

Abstraction là một phương pháp mạnh mẽ để quản lý các hệ thống phức tạp. Sự trừu tượng được quản lý bởi các đối tượng được xác định rõ và phân loại phân cấp của chúng.

Ví dụ một chiếc xe trong chính nó là một đối tượng được xác định rõ, bao gồm một số đối tượng nhỏ khác như hệ thống bánh răng, cơ chế lái, động cơ, một lần nữa có hệ thống con riêng. Nhưng đối với con người xe hơi là một đối tượng duy nhất, có thể được quản lý bởi sự giúp đỡ của các hệ thống con của nó, ngay cả khi các chi tiết bên trong của chúng chưa được biết rõ. Courtesy


Đóng gói: Bao bì lên thành viên dữ liệu và phương pháp với nhau thành một đơn vị duy nhất (ví dụ: Class) được gọi là Encapsulation.

Đóng gói giống như bao quanh trong một viên nang. Đó là bao gồm các hoạt động liên quan và dữ liệu liên quan đến một đối tượng vào đối tượng đó.

Đóng gói giống như túi của bạn, trong đó bạn có thể giữ bút, sách, v.v. Có nghĩa đây là tài sản của các thành viên và chức năng đóng gói.

class Bag{ 
    book; 
    pen; 
    ReadBook(); 
} 

Đóng gói nghĩa là ẩn chi tiết bên trong của đối tượng, tức là đối tượng làm gì đó.

Đóng gói ngăn cản khách hàng nhìn thấy khung nhìn bên trong của nó, nơi hành vi trừu tượng được thực hiện.

Đóng gói là một kỹ thuật được sử dụng để bảo vệ thông tin trong một đối tượng từ đối tượng khác.

Ẩn dữ liệu để bảo mật, chẳng hạn như biến các biến thành riêng tư và hiển thị thuộc tính để truy cập dữ liệu riêng tư sẽ công khai.

Vì vậy, khi bạn truy cập thuộc tính, bạn có thể xác thực dữ liệu và đặt dữ liệu đó. Courtesy

1

Đóng gói có thể được coi là giấy gói được sử dụng để liên kết dữ liệu và hoạt động với nhau như một đơn vị bảo vệ nó khỏi tất cả các loại bụi bẩn bên ngoài (tôi có nghĩa là chức năng bên ngoài).

Sự trừu tượng liên quan đến việc thiếu chi tiết và việc sử dụng giao diện đơn giản để điều khiển hệ thống phức tạp.

Ví dụ chúng ta có thể thắp sáng một bóng đèn bằng cách nhấn nút mà không phải lo lắng về kỹ thuật điện cơ bản (Trừu tượng).

Tuy nhiên, u không thể thắp sáng bóng đèn theo bất kỳ cách nào khác. (Encapsulation)

1

Tôi sẽ giải thích sự trừu tượng với một ví dụ thế giới thực. Nói trong nhà bạn có phích cắm điện và nhiều thiết bị có thể kết nối với cùng một đầu cắm nhưng phích cắm sẽ không bao giờ có ý tưởng thiết bị nào được kết nối, nói cách khác chi tiết của thiết bị được tóm tắt (ẩn) đối với phích cắm.

Hãy nghĩ xem điều gì sẽ xảy ra nếu chúng ta kết nối thiết bị trực tiếp với dây điện mà không cần cắm? Nói kết nối một bóng đèn trực tiếp với một dây, sau đó dây biết thiết bị nào được kết nối và khi nào chúng ta cần phải thay thế bóng đèn thì chúng ta phải tháo kết nối dây khỏi bóng đèn, có nghĩa là bóng được kết nối chặt chẽ với dây. Nói cách khác, bóng đèn và dây điện biết chi tiết nơi nó được kết nối, có nghĩa là không bị tóm tắt.

Trong việc trừu tượng hóa hướng đối tượng hoạt động chính xác như nhau. Lớp mà tiêu thụ các lớp khác hàm/thuộc tính không cần phải biết lớp nào hoạt động/thuộc tính mà nó tiêu thụ và mọi thứ nên được tóm tắt bằng một lớp giao diện/trừu tượng.

Hãy để tôi viết mã ví dụ tương tự. Ở đây tôi có một lớp "ElectricPlug", đang chạy một thiết bị. Nhưng lớp "ElectricPlug" không có ý tưởng về thiết bị nào đang chạy. Nó có thể là bất kỳ lớp nào thực hiện giao diện "IDevice", có nghĩa là việc triển khai "RunDevice" được tóm tắt từ "ElectricPlug". Đây là mã mẫu đầy đủ,

class Program 
{ 
    static void Main(string[] args) 
    { 
     ElectricPlug electricPlug = new ElectricPlug(new Bulb()); 
    } 
} 

public class ElectricPlug 
{ 
    private readonly IDevice _device; 
    public ElectricPlug(IDevice device) 
    { 
     _device = device; 
    } 

    public void Run() 
    { 
     _device.Rundevice(); 
    } 
} 


public interface IDevice 
{ 
    void Rundevice(); 
} 


public class Bulb : IDevice 
{ 
    public void Rundevice() 
    { 
     Console.WriteLine("Switched on bulb"); 
    } 
} 
1

Đóng gói là những gì nó giống như cách đặt hộp xung quanh cái gì đó để bảo vệ nội dung của nó. Trừu tượng là trích xuất các thuộc tính chức năng của một cái gì đó như vậy mà bạn có thể thực hiện các hoạt động chỉ bằng cách sử dụng những gì bạn đã trích xuất mà không có kiến ​​thức về các hoạt động bên trong.

Khi chúng tôi nói rằng hai chất là chất lỏng, chúng tôi đang sử dụng "chất lỏng" như là một trừu tượng hơn các thuộc tính của những chất mà chúng tôi đang lựa chọn để thảo luận. Sự trừu tượng đó cho chúng ta biết những điều chúng ta có thể làm với các chất được đưa ra bởi kinh nghiệm trước đây của chúng ta với chất lỏng.

Sự trừu tượng cũng không thực sự có liên quan gì đến những người thừa kế. Bạn có thể có một trừu tượng khác như "kim loại" chiết xuất các tính chất của các chất theo một cách khác.

Tóm tắt quên chi tiết, vì vậy nếu bạn đang sử dụng một trừu tượng cụ thể, bạn không nên hỏi về các thuộc tính của chất cơ bản không được cấp bởi trừu tượng. Giống như nếu bạn uống sữa và nước và trộn chúng lại với nhau, bạn sẽ gặp khó khăn sau đó hỏi bạn có bao nhiêu sữa.

Một hàm Functor là một trừu tượng về một cái gì đó có một số khái niệm về bản đồ, có nghĩa là, bạn có thể chạy một hàm trên nội dung bên trong nó biến đổi bit bên trong thành bất kỳ thứ gì khác. Thứ gì đó bên ngoài vẫn là cùng một thứ. Trong trường hợp điều này hữu ích là nếu bạn có một hàm hoạt động trên Danh sách và bạn nhận ra mình chỉ phụ thuộc vào giao diện bản đồ, bạn có thể phụ thuộc vào Functor và sau đó hàm của bạn có thể làm việc với luồng, lời hứa, maybes , tuples, và bất cứ điều gì khác mà chia sẻ mà trừu tượng.

Các ngôn ngữ chức năng như Haskell có một số sức mạnh trừu tượng thực sự tuyệt vời làm cho việc sử dụng lại mã cực kỳ thiết thực.

Các vấn đề liên quan