Hi lô anh em.
Lâu lắm mình không viết bài, mà chủ yếu các bạn bên lab bảo mật thôi. Nên hôm nay mình biên đôi dòng về lập trình hướng đối tượng.
Bài viết này giành cho ai đã học qua về hướng đối tượng(Object-Oriented Programming).
Ta sẽ lấy ví dụ về lớp cha là Động vật, 2 lớp con là Chó và Gà.
Những điểm mạnh của hướng đối tượng OOP như sau:
lớp và đối tượng: Tạo ra một bảng thiết kế ràng buộc giữa các đối tượng và hành vi của chúng. Ví dụ như động vật thì biết đi, gà kế thừa từ động vật thì nó cũng biết đi, ngoài ra thêm các tính chất riêng của nó là biết đi bằng 2 chân(khác với Chó đi bằng 4 chân).
Tái sử dụng: Bạn có thể dùng hàm đi từ lớp động vật và viết lại 1 hàm cùng tên ở lớp gà, nhưng viết rõ là nó đi bằng 2 chân. Còn lớp chó bạn viết lại hàm đó, nhưng nói rõ nó đi bằng 4 chân.
Đa hình: Hàm đi ở trên chỉ được gọi trong thời gian thực. Nghĩa là khi 1 đối tượng thuộc lớp gà gọi hàm từ lớp Động vật, thì nó mới thực thi ở bên trong lớp gà. Các lớp khác như lớp Chó cũng làm tương tự, chỉ được gọi khi nó xác định đối tượng đó thuộc lớp nào.
Đóng gói: Nói đơn giản là gói những thứ của lớp cho gọn gàng để tiện sử dụng. Ví dụ lớp Gà có các tính chất, thủ tục public như gáy, số chân, thì đặt là public. Riêng 1 con gà bạn không thể để hở ra tim của nó thì đặt là private, không cho ai sờ vào tim của 1 con vật cả phải không?

Tiếp theo, chúng ta sẽ đi tới phần những điểm yếu chí tử của hướng đối tượng.
Những thay đổi lớp cha sẽ ảnh hưởng tới lớp con.
Trong ví dụ trên, giả sử bạn muốn thay đổi tên hàm đi của động vật từ Run() sang run thì sẽ có nhiều vấn đề. Đây chỉ là việc đổi tên viết hoa thành viết thường, bạn có thể dùng IDE để rename, đổi tất cả tên của các lớp Gà hay Chó kế thừa hàm này. Nhưng thử tưởng tượng, trong một dự án thực tế rất nhiều khi vấn đề yêu cầu sửa phức tạp hơn nhiều, bạn sẽ mất rất nhiều thời gian để sửa đổi, test lại.
Hệ thống phân lớp phức tạp.
Giả sử ở lớp Gà, bạn tạo thêm các lớp Gà khác như Gà Rừng, Gà Công nghiệp Kế thừa từ lớp gà.
Tất nhiên bạn có thể dùng hàm init theo type của từng loại gà cho đơn giản, nhưng nhiều lập trình viên thiếu kinh nghiệm, hoặc dự án không cho phép bạn thay đổi hàm tạo, thì bạn bắt buộc phải đẻ ra những thứ code kiểu như vậy. Rồi từ Gà Công nghiệp, bạn lại tạo ra lớp Gà công nghiệp Mỹ, gà công nghiệp Tàu..
Bạn đã bắt gặp rất nhiều tình huống thực tế như vậy phải không? Và chắc hẳn bạn đã chửi rất nhiều những dev trước. Nhưng như đã nói, trình độ coding không đồng đều, chúng ta không thể kiểm soát được tất cả các tình huống trong tương lai.. Chúng ta phải chấp nhận thôi.
Cú pháp dài dòng.
Ví dụ java bạn lúc nào cũng phải có setter và getter cho biến. Khá mệt mỏi nếu không có IDE generation chúng.
Vậy chúng ta nên giải quyết những vấn đề trên như nào?
Với kinh nghiệm của mình, khi các bạn thiết kế ra một đối tượng, hãy tưởng tượng ra tất cả các case có thể xảy ra ở cả trong tương lai. Không dùng các tính chất của hướng đối tượng một cách máy móc.
Và rất nhiều ngôn ngữ lập trình đã giải quyết điểm yếu này bằng cách tiếp cận khác. Ví dụ, swift chúng ta có lập trình dạng protocol – đưa các vấn đề về dạng ảo hóa để sau này có thể đơn giản trong việc thay đổi.
Bạn có thể đọc thêm ở đây.
Một ngôn ngữ tiếp cận OOP theo hướng cấu trúc, đó là Go.
Bạn có thể đọc ở đây:
https://dev.to/pandax185/object-oriented-programming-in-go-abalanced-comparison-with-traditional-oop-36l8
Mình sẽ viết tiếp các bài tiếp theo, hãy đón đợi nhé.