Lập trình hướng đối tượng (OOP) là gì?
Lập trình hướng đối tượng (OOP) là một phong cách lập trình dựa trên khái niệm "công nghệ đối tượng". Trong OOP, các đối tượng chứa các dữ liệu và các phương thức để truy xuất và hiệu chỉnh dữ liệu của các đối tượng khác. Chương trình được thiết kế bằng cách tách nó ra khỏi phạm vi các đối tượng tương tác với nhau. [^1^]
Bốn tính chất của OOP
OOP có bốn tính chất chính sau đây:
1. Tính trừu tượng (abstraction)
Tính trừu tượng cho phép chương trình tập trung vào những cốt lõi cần thiết và bỏ qua những khía cạnh không cần thiết của dữ liệu. Các đối tượng có thể hoàn tất các công việc nội bộ mà không cần biết cách thưc hiện. Tính trừu tượng này thường được xác định trong khái niệm gọi là lớp trừu tượng hay lớp cơ sở trừu tượng.
2. Tính đóng gói và che giấu thông tin (encapsulation và information hiding)
Tính đóng gói không cho phép người sử dụng thay đổi trạng thái của một đối tượng. Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó. Điều này đảm bảo sự toàn vẹn của đối tượng.
3. Tính đa hình (polymorphism)
Tính đa hình cho phép gửi các thông điệp tới đối tượng và phản ứng khác nhau dựa vào loại đối tượng được gửi. Các phương thức có thể được định nghĩa cho một loạt các đối tượng gần nhau, nhưng được gọi bằng cùng một tên mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứng với đặc tính của từng đối tượng.
4. Tính kế thừa (inheritance)
Tính kế thừa cho phép một đối tượng có thể có các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho phép chia sẻ hoặc mở rộng các đặc tính sẵn có mà không cần định nghĩa lại.
Tính trừu tượng và tư duy trong lập trình OOP
Thầy giáo dạy công nghệ phần mềm của tôi đã từng nói một câu rằng, "Khả năng yếu nhất của lập trình viên Việt Nam là tính trừu tượng hoá." Thời điểm đó, tôi không đồng ý hoàn toàn với quan điểm đó. Tuy nhiên, qua nhiều năm làm việc với nhiều công ty công nghệ khác nhau, tôi đã nhận ra sự chính xác của câu nói đó.
Trong quá trình triển khai chức năng gửi email cho khách hàng, tôi đã gặp nhiều lần các đoạn code kiểu dạng yếu tố không trừu tượng. Ví dụ, khi chúng tôi cần triển khai chức năng gửi SMS, một số người đề xuất tạo phương thức sendSMS() trong class Email.
Tuy nhiên, vấn đề này được giải quyết bằng cách tạo một class SMS mới với phương thức sendSMS().
Một tình huống khác là khi chúng tôi cần gửi notification vào trang cá nhân của khách hàng. Một số người vẫn tiếp tục đề xuất tạo class mới với tên Notification, trong khi một số khác nhận ra rằng chúng đã sai từ những thiết kế ban đầu.
Một lập trình viên hiểu biết về OOP sẽ nhận ra rằng class Sender với phương thức sendMessage() là giải pháp tốt nhất.
Sai lầm thường gặp khi thiết kế hệ thống là người ta quá tự tin và không chấp nhận thay đổi. Nhưng chúng ta không thể biết trước những gì sẽ thay đổi, do đó việc trừu tượng hoá là cực kỳ quan trọng.
Tuy nhiên, việc hiểu rõ ý nghĩa của trừu tượng trong lập trình OOP không đủ. Tôi từng nhìn thấy một lập trình viên "có kinh nghiệm" triển khai class Sender với các phương thức sendEmail(), sendSMS(). Điều này đã vi phạm nguyên tắc encapsulation của đối tượng.
Tư duy trong lập trình là điều có thể dễ dàng thay đổi, nhưng thuyết phục một người thay đổi tư duy lại khó khăn hơn gấp bội. Tôi đã gặp nhiều lần những lập trình viên phủ định ý tưởng mới mà họ chưa hiểu rõ. Thay vì chấp nhận thay đổi, họ lý giải rằng thiết kế hiện tại phù hợp hoặc hệ thống đang chạy như vậy.
Nếu chúng ta không chấp nhận thay đổi, thì điều đó chỉ là điên cuồng. Tổng hợp từ nhiều nguồn, tôi nhận thấy rằng hãy trừu tượng hoá nhiều nhất có thể vì chúng ta không thể biết trước những gì sẽ xảy ra.
Mỗi lập trình viên đều có khả năng sáng tạo và tư duy độc đáo. Chúng ta cần hiểu sâu hơn về OOP và sử dụng tư duy linh hoạt để thiết kế hệ thống sao cho phù hợp.
Hãy luôn thay đổi và cải thiện kiến thức của bạn. Đừng tái tạo điều gì đó lặp lại mà không mong đợi đến kết quả khác biệt.