Tính Trừu Tượng (Abstraction) Trong C++

Tính trừu tượng

Bên cạnh việc nắm vững những kiến thức liên quan đến tính đa hình, tính kế thừa hay tính đóng gói thì tính trừu tượng cũng phải được nhắc đến khi làm việc với chương trình C++. Để giúp các bạn có góc nhìn tổng quát về đặc tính này, chúng tôi sẽ trình bày chi tiết những nội dung liên quan đến nó thông qua bài viết này.

Giới thiệu về tính trừu tượng trong C++

Khi nói đến ngôn ngữ lập trình C++, chúng ta có thể hiểu là thuộc tính với chức năng phân tách quá trình thực thi trên đối tượng từ phương pháp mà nó được dùng hay truy cập. Nói cách khác, đây là một đối tượng được dùng mà không cần phải biết quá rõ về cách thức nó được thực hiện bên trong.

Không những vậy để hiểu được tính trừu tượng trong ngôn ngữ lập trình C++, chúng ta cần xem xét qua những lớp trừu tượng. Lớp trừu tượng chính là lớp không có chức năng tạo ra đối tượng trực tiếp từ nó. Tuy vậy, nó được dùng như lớp cơ sở để phù hợp đối với lớp con.

Những lớp con này sẽ được kế thừa những tính chất hay hàm từ lớp cơ sở nhưng sẽ được định nghĩa bổ sung với những tính chất hay hàm riêng cho chúng. Nói tóm lại, quá trình dùng lớp trừu tượng cũng như thừa kế là phương pháp hữu dụng để phân tách giao diện trên lớp đối tượng tương ứng với những chi tiết hoạt động phía trong của nó. Chính vì thế, làm cho mã có tính linh hoạt hay thuận lợi cho việc bảo trì cũng như mở rộng trong những dự án tiếp theo.

Tính trừu tượng trong C++
Hình 1. Tính trừu tượng trong C++

Những ưu điểm của quá trình trừu tượng hóa dữ liệu

Trừu tượng hóa dữ liệu được hiểu như một định nghĩa quan trọng đối với ngôn ngữ lập trình C++ và cũng chính ngôn ngữ này bổ trợ tính năng này thông qua những lớp trừu tượng. Sau đây, chúng ta cùng nhau tìm hiểu về các ưu điểm của quá trình trừu tượng hóa dữ liệu.

1. Giảm tần suất phụ thuộc

Trừu tượng hóa dữ liệu sẽ hỗ trợ giảm thiểu sự lệ thuộc vào mã trên dữ liệu. Thay vào đó, đoạn mã này sẽ dùng những lớp trừu tượng để tiện việc truy cập đối với dữ liệu. Cũng chính vì thế, nó bổ trợ cho mã càng ngày càng linh hoạt và thuận tiện cho việc bảo trì.

2. Có thể tái sử dụng mã

Quá trình sử dụng trừu tượng hóa dữ liệu sẽ hỗ trợ mã có thể dùng lại linh hoạt và hiệu quả hơn. Trong trường hợp đối tượng mới cần bổ sung, mã sẽ thực thi lớp trừu tượng mới hơn là tùy chỉnh đoạn mã ở thời điểm này. Do đó, bạn hoàn toàn có thể tốn ít thời gian để phát triển chương trình và tránh gặp các lỗi phát sinh.

Tính trừu tượng hỗ trợ tái sử dụng mã
Hình 2. Tính trừu tượng hỗ trợ tái sử dụng mã

3. Sự linh hoạt

Trừu tượng hóa dữ liệu hỗ trợ dữ liệu có thể được dùng mà không cần quan tâm về phương pháp nó thực hiện bên trong. Nhờ vậy, nó sẽ làm cho mã thêm linh hoạt và hỗ trợ mã sử dụng trên nhiều loại dữ liệu đa dạng và khác nhau.

4. Ít phức tạp hơn

Trừu tượng hóa dữ liệu sẽ có chức năng giảm thiểu tính phức tạp trên mã thông qua phương pháp ẩn đi những chi tiết triển khai từ phía trong của đối tượng. Từ đó, các bạn sẽ đọc mã nhanh và dễ hơn.

Để giúp cho các bạn dễ hình dung về trừu tượng hóa dữ liệu, chúng tôi xin trình bày ví dụ dưới đây.

Tính trừu tượng sẽ làm giảm độ phức tạp chương trình
Hình 3. Tính trừu tượng sẽ làm giảm độ phức tạp chương trình

Ví dụ: Hãy dùng lớp trừu tượng ‘Shape’ và những lớp con liên quan đến nó để biểu thị những hình học cơ bản.

#include <iostream>

using namespace std;

// Lớp trừu tượng Shape định nghĩa các thuộc tính và phương thức chung cho các hình học

class Shape {

public:

virtual double area() = 0; // phương thức ảo để tính diện tích

};

// Lớp con của Shape, đại diện cho hình vuông

class Square : public Shape {

private:

double side; // độ dài cạnh của hình vuông

public:

Square(double s) { side = s; } // constructor

double area() { return side * side; } // tính diện tích của hình vuông

};

// Lớp con của Shape, đại diện cho hình tròn

class Circle : public Shape {

private:

double radius; // bán kính của hình tròn

public:

Circle(double r) { radius = r; } // constructor

double area() { return 3.14 * radius * radius; } // tính diện tích của hình tròn

};

int main() {

// tạo đối tượng Square và tính diện tích

Square s(5);

cout << "Diện tích hình vuông: " << s.area() << endl;

// tạo đối tượng Circle và tính diện tích

Circle c(3);

cout << "Diện tích hình tròn: " << c.area() << endl;

return 0;

}

Từ ví dụ trên, lớp trừu tượng ‘Shape’ sẽ được dùng cho việc định nghĩa hàm ảo ‘area()’ để tính diện tích những hình học khác nhau. Tiếp đến, lớp con Circle và Square được kế thừa từ lớp ‘Shape’ cũng như áp dụng hàm ‘area()’ để tính diện tích hình tròn hay hình vuông. Cuối cùng, sau khi chạy đoạn code trên, các bạn có thể tạo ra đối tượng Square cũng như Circle kèm theo việc dùng hàm ‘area()’ phục vụ cho việc tính diện tích của chúng.

Nhãn truy cập (Access Label)

Nhãn truy cập hoàn toàn có thể được dùng để bổ trợ tính trừu tượng nằm ở bên trong các lớp. Lúc này, khi khai báo một thành phần bất kỳ trên lớp ở phạm vi ‘private’ thì nó không thể truy cập ở bên ngoài lớp. Chính vì vậy, dữ liệu của lớp được bảo vệ và hỗ trợ tính trừu tượng trên lớp.

Những thành phần ‘public’ từ lớp thường có thể dùng cho việc cung cấp những giao diện công khai cho người dùng. Ngược lại, những thành phần như ‘protected’ và ‘private’ có thể được dùng cho việc ẩn những chi tiết nằm ở phía trong của lớp kèm theo việc bảo vệ dữ liệu trên lớp.

Cuối cùng, nhãn truy cập sẽ hỗ trợ bảo đảm các thành phần bên trong của lớp sẽ không bị thay đổi hay được phép truy cập từ phía ngoài lớp nhằm bảo vệ lớp và chuẩn hóa tính trừu tượng.

Những chiến lược thiết kế cho tính trừu tượng trong C++

Như đã nói ở trên trừu tượng hóa dữ liệu sẽ giúp bạn phân rõ đoạn mã thành hai thành phần như InterfaceImplementation. Cũng vì vậy, trong quá trình thiết kế những thành phần của người dùng, cần phải nhớ duy trì Interface độc lập với Implementation. Trong trường hợp khi bạn biến đổi underlying implementation thì Interface sẽ vẫn có sẵn như lúc đầu.

Đối với tình huống này, những chương trình đang xài Interface này, chúng hoàn toàn không bị tác động đến và yêu cầu một quá trình tái biên dịch với Implementation hiện đại nhất.

Lời Kết

Trong bài viết này, chúng tôi đã đề cập đầy đủ những thông tin liên quan đến tính trừu tượng cũng như ưu điểm, nhãn truy cập và chiến lược thiết kế của nó trong chương trình C++. Một lần nữa, chúng tôi mong nhận được ý kiến đóng góp của quý đọc giả để hoàn thiện hơn trong tương lai.

Rate this post
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận