Bạn đã bao giờ nghe đến khái niệm "tính đóng gói" trong lập trình hướng đối tượng chưa? Đây là một trong số 4 tính chất đặc trưng chung của các ngôn ngữ lập trình hướng đối tượng như C++, C#, Java, Objective-C... Tuy nhiên, đôi khi chúng ta có thể đã quen dùng tính đóng gói mà không hiểu rõ nó là gì. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về tính đóng gói trong lập trình hướng đối tượng.
Tính đóng gói - Khái niệm cơ bản trong lập trình hướng đối tượng
Tính đóng gói (Encapsulation) đơn giản là việc kết hợp một bộ các dữ liệu liên quan đến nhau cùng với một bộ các hàm/phương thức hoạt động trên các dữ liệu đó, "gói" tất cả vào trong một cái gọi là class. Các thực thể của các class thì được gọi là các đối tượng (objects) trong khi class giống như một công thức được sử dụng để tạo ra các đối tượng đó.
Một ví dụ đơn giản về tính đóng gói như sau. Giả sử chúng ta có một class về hình chữ nhật, trong đó có các dữ liệu như chiều rộng và chiều dài cùng với các hàm xử lý (đọc/ghi/tính toán) với các dữ liệu này. Chúng ta có thể tạo ra các đối tượng hình chữ nhật từ class này và thực hiện các thao tác trên các đối tượng đó.
Sự khác biệt giữa Encapsulation và Data Hiding
Trong quá trình tìm hiểu về tính đóng gói, chúng ta có thể lẫn lộn với khái niệm che dấu dữ liệu (Data Hiding). Vậy sự khác biệt giữa chúng là gì?
Che dấu dữ liệu (Data Hiding) là việc một số dữ liệu và hàm/phương thức được class che giấu đi (ở dạng private) để đảm bảo rằng các dữ liệu đó sẽ được truy cập và sử dụng đúng mục đích, đúng cách thông qua các hàm/phương thức ở dạng public mà class cung cấp. Bạn không thể truy cập đến các dữ liệu hoặc gọi đến các phương thức private của class từ bên ngoài class đó.
Dễ hiểu hơn, che dấu dữ liệu chỉ là một phương pháp kỹ thuật được áp dụng để xây dựng nên class, nó không phải là tính chất đặc trưng của lập trình hướng đối tượng. Việc áp dụng phương pháp này hay không là hoàn toàn tùy thuộc vào yêu cầu của dự án. Tuy nhiên, trong các hệ thống thực tế, việc áp dụng phương pháp che dấu dữ liệu gần như là đương nhiên để nâng cao tính security, giảm phụ thuộc giữa các class, tránh lỗi do đọc ghi dữ liệu sai cách...
Đoạn code dưới đây là một ví dụ minh họa về tính đóng gói và che dấu dữ liệu trong lập trình hướng đối tượng:
class Rectangle {
private:
int mWidth;
int mHeight;
public:
void setValues(int width, int height) {
mWidth = width;
mHeight = height;
}
int getArea() {
return mWidth * mHeight;
}
};
Trong ví dụ này, chúng ta sử dụng tính đóng gói để kết hợp các dữ liệu về hình chữ nhật gồm chiều rộng và chiều dài cùng với các hàm xử lý (đọc/ghi/tính toán) với các dữ liệu này trong class Rectangle. Đồng thời, chúng ta áp dụng phương pháp che dấu dữ liệu bằng cách đặt các dữ liệu mWidth, mHeight là private và chỉ có thể truy cập chúng thông qua các phương thức public như setValues(), getArea().
Kết luận
Thông qua bài viết này, chúng ta đã tìm hiểu về khái niệm tính đóng gói trong lập trình hướng đối tượng. Tính đóng gói là một trong số những tính chất quan trọng của lập trình hướng đối tượng và được sử dụng để tổ chức và quản lý dữ liệu và hành vi của các đối tượng trong chương trình.
Để nâng cao hiểu biết về lập trình hướng đối tượng, hãy xem thêm về các tính chất khác như kế thừa - inheritance và đa hình - polymorphism, cũng như tính trừu tượng - abstraction.