Lập trình hướng đối tượng (OOP) với 4 tính chất cơ bản bao gồm:
- Tính trừu tượng (abstraction).
- Tính đóng gói (encapsulation).
- Tính kế thừa (inheritance).
- Tính đa hình (polymorphism).
Để hiểu nó thì cần các khái niệm, bài viết này hỗ trợ 1 vài ví dụ để làm khái niệm hiểu căn bản về tính trừu tượng và OOP.
OOP
OOP theo tự nhiên
Với góc nhìn này chỉ cần 1 phương pháp lập trình sao cho các lập trình viên khác khi khảo sát code có thể hiểu rằng: Đây là 1 nhóm dữ liệu có liên quan với nhau mà không cần quá nhiều chú thích. Nếu đạt được điều này, nghĩa là code có mang 1 lượng nội dung giúp gia tăng khả năng trừu tượng.
Để giải thích rõ hơn, xem xét các bước ví dụ bên dưới.
Tính trừu tượng hóa dữ liệu
Ví dụ 1 - Code không mang nhiều nội dung
int main() { char* name; int cpu; int ram; float price; return 0; }
Với đoạn code như vậy, nội dung đang đề cập vẫn chưa rõ ràng, chưa biết đang đề cập điều gì (mặc dù có từ khóa cpu
và ram
) có thể đoán được 1 ít thông tin là đang đề cập đến cái máy tính nhưng độ tin cậy vẫn ở mức thấp.
Ví dụ 2 - Code mang được nhiều ý nghĩa hơn
int main() { char* name_1; int cpu_1; int ram_1; float price_1;
// LINE 8
char* name_2; int cpu_2; int ram_2; float price_2; return 0; }
Để ý dòng // LINE 8
, thông tin đó giúp ta định hướng rõ ràng hơn, nó ngăn cách các "cụm biến", giúp định hướng nhiều hơn về sự liên quan nhiều hơn giữa các biến.
Ví dụ 3 - Code "nói" được nhiều hơn nữa
int main() { char* phone_name_1; int phone_cpu_1; int phone_ram_1; float phone_price_1;
// LINE 8
char* phone_name_2; int phone_cpu_2; int phone_ram_2; float phone_price_2; return 0; }
Thêm tiền tố phone_
vào trước các tên biến, gia tăng khả năng định hướng, tạo ra 1 thể thống nhất hơn, hình thành 1 dữ liệu được trừu tượng hóa, và đây là 1 cách thức đơn giản.
Với cách hiện thực ở ví dụ 3 này, có thể thấy ngôn ngữ lập trình nào cũng đều có khả năng hướng đối tượng, nhưng độ tin cậy không cao do mang nhiều cảm tính và vẫn có thể can thiệp vào chi tiết quá sâu (quá tường tận phone_
có gì thay vì hiểu đó là phone
), do đó cần được hỗ trợ nhiều hơn để mang độ chính xác cao.
Ví dụ 4 - Sự hỗ trợ của ngôn ngữ lập trình
Ví dụ 3 đã hiện thực được các "đối tượng" cụ thể, với cách làm này dữ liệu đã được trừu tượng nhưng vẫn có độ chính xác không cao, do đó nên sử dụng struct
hoặc class
để thống nhất chuẩn chung và độ chính xác cao hơn, không những vậy nó còn hỗ trợ nhiều công cụ hữu ích giúp lập trình nhanh hơn và kiến trúc phần mềm rõ ràng hơn.
struct và class
struct
và class
, nhất là class
ra đời hỗ trợ lập trình hướng đối tượng tốt hơn. Khả năng của struct và class có thể sử dụng để "đại diện" cho cả một nhóm dữ liệu thay vì phải gõ lại rất nhiều, và làm tăng khả năng nhìn thấy tính trừu tượng. Bên cạnh đó cũng dễ dàng hỗ trợ nhiều công cụ hữu ích như hàm tạo, hàm tạo sao chép, hàm hủy, hay viết lại các phương thức, ... hay chỉ dẫn rõ ràng hơn sự tương tác giữa các đối tượng.
class Phone { char* name; int cpu; int ram; float price; }; int main() { Phone phone_1; Phone phone_2; return 0; }