Tóm tắt dữ liệu trong C ++
Trừu tượng hóa dữ liệu đề cập đến việc chỉ cung cấp thông tin cần thiết cho thế giới bên ngoài và che giấu các chi tiết cơ bản của chúng, tức là để thể hiện thông tin cần thiết trong chương trình mà không trình bày chi tiết.
Trừu tượng hóa dữ liệu là một kỹ thuật lập trình (và thiết kế) dựa trên sự tách biệt giữa giao diện và việc triển khai.
Hãy lấy một ví dụ thực tế về TV, bạn có thể bật và tắt, thay đổi kênh, điều chỉnh âm lượng và thêm các thành phần bên ngoài như loa, VCR và đầu DVD, NHƯNG bạn không biết chi tiết bên trong của nó, là, bạn không biết cách nó nhận tín hiệu qua mạng hoặc qua cáp, cách nó dịch chúng và cuối cùng hiển thị chúng trên màn hình.
Vì vậy, chúng ta có thể nói rằng một chiếc tivi tách biệt rõ ràng việc triển khai bên trong của nó với giao diện bên ngoài và bạn có thể chơi với các giao diện của nó như nút nguồn, bộ đổi kênh và điều khiển âm lượng mà không cần biết gì về phần bên trong của nó.
Trong C ++, các lớp cung cấp mức độ data abstraction. Chúng cung cấp đủ các phương thức công khai cho thế giới bên ngoài để chơi với chức năng của đối tượng và thao tác dữ liệu đối tượng, tức là trạng thái mà không thực sự biết lớp đã được triển khai bên trong như thế nào.
Ví dụ: chương trình của bạn có thể thực hiện cuộc gọi đến sort()hàm mà không biết hàm thực sự sử dụng thuật toán nào để sắp xếp các giá trị đã cho. Trên thực tế, việc triển khai cơ bản của chức năng sắp xếp có thể thay đổi giữa các bản phát hành của thư viện và miễn là giao diện giữ nguyên, lệnh gọi hàm của bạn sẽ vẫn hoạt động.
Trong C ++, chúng tôi sử dụng classesđể xác định các kiểu dữ liệu trừu tượng (ADT) của riêng chúng ta. Bạn có thể dùngcout đối tượng của lớp ostream để truyền dữ liệu đến đầu ra tiêu chuẩn như thế này -
#include <iostream>
using namespace std;
int main() {
cout << "Hello C++" <<endl;
return 0;
}
Ở đây, bạn không cần phải hiểu cách couthiển thị văn bản trên màn hình của người dùng. Bạn chỉ cần biết giao diện công khai và việc triển khai cơ bản của 'cout' có thể tự do thay đổi.
Truy cập Nhãn Thực thi Tóm tắt
Trong C ++, chúng ta sử dụng các nhãn truy cập để xác định giao diện trừu tượng cho lớp. Một lớp có thể chứa không hoặc nhiều nhãn truy cập -
Các thành viên được xác định với nhãn công khai có thể truy cập vào tất cả các phần của chương trình. Dạng xem trừu tượng hóa dữ liệu của một kiểu được xác định bởi các thành viên công khai của nó.
Các thành viên được xác định với một nhãn riêng không thể truy cập vào mã sử dụng lớp. Các phần riêng tư ẩn việc triển khai khỏi mã sử dụng loại.
Không có giới hạn nào về tần suất một nhãn truy cập có thể xuất hiện. Mỗi nhãn truy cập chỉ định mức truy cập của các định nghĩa thành viên kế tiếp. Mức truy cập đã chỉ định vẫn có hiệu lực cho đến khi gặp nhãn truy cập tiếp theo hoặc dấu ngoặc nhọn đóng bên phải của phần thân lớp.
Lợi ích của việc trừu tượng hóa dữ liệu
Sự trừu tượng hóa dữ liệu cung cấp hai lợi thế quan trọng:
Nội bộ lớp được bảo vệ khỏi các lỗi cấp người dùng vô tình, có thể làm hỏng trạng thái của đối tượng.
Việc triển khai lớp có thể phát triển theo thời gian để đáp ứng với các yêu cầu thay đổi hoặc báo cáo lỗi mà không yêu cầu thay đổi mã cấp người dùng.
Bằng cách chỉ xác định các thành viên dữ liệu trong phần riêng tư của lớp, tác giả của lớp có thể tự do thực hiện các thay đổi trong dữ liệu. Nếu việc triển khai thay đổi, chỉ mã lớp cần được kiểm tra để xem những gì có thể ảnh hưởng đến sự thay đổi. Nếu dữ liệu là công khai, thì bất kỳ chức năng nào truy cập trực tiếp vào các thành viên dữ liệu của biểu diễn cũ có thể bị hỏng.
Ví dụ về trừu tượng hóa dữ liệu
Bất kỳ chương trình C ++ nào mà bạn triển khai một lớp với các thành viên công cộng và riêng tư đều là một ví dụ về trừu tượng hóa dữ liệu. Hãy xem xét ví dụ sau:
#include <iostream>
using namespace std;
class Adder {
public:
// constructor
Adder(int i = 0) {
total = i;
}
// interface to outside world
void addNum(int number) {
total += number;
}
// interface to outside world
int getTotal() {
return total;
};
private:
// hidden data from outside world
int total;
};
int main() {
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Total 60
Lớp trên cộng các số lại với nhau và trả về tổng. Các thành viên công cộng -addNum và getTotallà các giao diện với thế giới bên ngoài và người dùng cần biết chúng để sử dụng lớp. Thành viên riêngtotal là thứ mà người dùng không cần biết, nhưng cần thiết để lớp hoạt động bình thường.
Chiến lược thiết kế
Tính trừu tượng phân tách mã thành giao diện và triển khai. Vì vậy, trong khi thiết kế thành phần của bạn, bạn phải giữ giao diện độc lập với việc triển khai để nếu bạn thay đổi triển khai cơ bản thì giao diện sẽ vẫn nguyên vẹn.
Trong trường hợp này, bất kỳ chương trình nào đang sử dụng các giao diện này, chúng sẽ không bị ảnh hưởng và chỉ cần biên dịch lại với cách triển khai mới nhất.