Lập trình hướng đối tượng, khó hiểu hay do mình không hiểu

    Bạn đang học lập trình, bạn đang tìm hiểu về  lập trình hướng đối tượng, bạn cảm thấy nó quá khó, bạn thấy thật mệt mỏi, chán nản, suy nghĩ rằng mình sắp rớt môn rồi, huhu. Không sao, mình sẽ chia sẻ cho bạn về hướng đối tượng từ một người từng rớt môn hướng đối tượng. Oke lets go...

1. Lập trình hướng đối tượng (Object Oriented Programming) là gì ?

    Thật ra khi bạn tra trên mạng sẽ ra đầy đủ định nghĩa về nó nhưng bạn cứ hiểu nó là một kĩ thuật lập trình, bằng cách tổ chức, xây dựng code thành các đối tượng (object). Chúng ta sẽ đưa các đối tượng ở thực tế vào trong code và biểu hiện chúng thông qua lớp (class).

2. Vậy tại sao cần nên lập trình theo hướng đối tượng?
     Nếu trong một team có 4 đến 5 thành viên, mỗi người mỗi style coding, ông A thì tạo ra 1 cái hàm tạo ra con chó husky ngáo, ông B cũng dô xài cái hàm tạo con chó đó nhưng không vừa ý vì muốn con chó phải becgie trông cho nó lực. Thế là dô sửa cái hàm tạo con chó đó, xong ông A biết được nên hẹn ông B ra đấm nhau để giải quyết vấn đề.

    Đó là câu chuyện mình bịa ra thôi chứ thực chất không có đâu. Tóm lại nếu bạn code theo hướng đối tượng sẽ giúp cho code bạn có hệ thống hơn, người khác có thể dễ dàng follow theo (phải biết OOP), giúp cho việc phát triển, mở rộng phần mềm dễ dàng hơn.

    Khi bạn áp dụng hướng đối tượng sẽ giúp bạn:
    • Mô hình hóa những thứ phức tạp dưới dạng cấu trúc đơn giản.
    • Code có thể tái sử dụng lại, giúp tiết kiệm tài nguyên.
    • Giúp sửa lỗi dễ dàng hơn. So với việc tìm lỗi ở nhiều vị trí trong code thì tìm lỗi trong các lớp (được cấu trúc từ trước) đơn giản và ít mất thời gian hơn.
    • Có tính bảo mật cao, bảo vệ thông tin thông qua đóng gói.
    • Dễ mở rộng dự án.

3. Lớp (class) và đối tượng (object) trong OOP:

    Như mình đã nói ở trên, một đối tượng sẽ được thể hiện trừu tượng bằng một class, trong mỗi class sẽ có 2 thành phần chính là thuộc tính và phương thức.

  • Thuộc tính (property): là những thông tin về đặc điểm của đối tượng
  • Phương thức (method): là những hành động mà đối tượng có thể thực hiện.
    Khi bạn khởi tạo class thông qua thuôc tính $a = new ClassName() thì nó đựợc gọi object
4. Các tính chất trong OOP:

    4.1 Tính đóng gói (Encapsultion):

    Bạn có thể thấy các thuộc tính hay phương thức có chứa các từ như: public, protected, private. Đây là các cách mà OOP quy định phạm vi truy cập (access modifier) cho một thuộc tính hay một phương thức trong một class.

    + Public: Bất kì ở đâu cũng có thể truy cập đến được.

    + Protected: Những class kế thừa (sử dụng extends) mới được truy cập

    + Private: Chỉ truy cập nội bộ trong class đó.

    Ví dụ thực tế, ở những nơi công cộng bạn có thể tự do ra vào như công viên, nhưng có những nơi thì bạn không được phép ra vào, chỉ những người liên quan mới có thể tự do ra vào nơi đó. Trong lập trình cũng vậy, có những class bạn có thể truy cập và sử dụng, nhưng có những class thì không. Đó được gọi là tính đóng gói.

    Nói tóm lại ở tính chất này có thể xem là cách để quy định các phạm vi truy cập trong một class, mục đích của nó là ý số 4 trong mục Tại sao cần lập trình theo hướng đối tượng?.

    4.2 Tính kế thừa (Extends)

     Tính chất này thì khá dễ hiểu, tính chất này liên quan đến việc tái sử dụng code (reuseable) kế thừa những thứ đã có ở class cha, và có thể chỉnh sửa, thêm những phần mới trong class con. Từ khóa cho tính chất này là extends, vậy tại sao lại cần tính chất này? Và khi nào nên áp dụng tính chất kế thừa.

    Mình lấy ví dụ, khi bạn xây dựng một hệ thống quản lý người dùng cho một trường học, cho đối tượng là giáo viên và học sinh. Ban đầu bạn xây dựng 2 class là Teacher và Student dựa trên 2 đối tượng với các thuộc tính và phương thức liên quan.

    Bạn có nhận thấy rằng giữa class Teacher và Student có nhiều sự trùng lặp như có thuộc tính First name, last name, birth year, phone và các phương thức có logic tương đương như: view profile, edit profile, view exam results...

    Chúng ta có thể xây dựng một class chung chứa những thứ trùng lặp và kế thừa ở class Teacher và Student. Như vậy bạn đã tránh được việc trùng lặp và code bạn cũng có thể tái sử dụng lại.

    Kế thừa đồng nghĩa bạn có thêm nhưng thứ mới hoặc thay đổi những thứ kế thừa (override).

    4.2 Tính trừu tượng (Abstract)

    Đây có thể là tính chất gây khó hiểu nhất, nhưng mình nghĩ đây là tính chất khá quan trọng trong lập trình OOP vì nó ảnh hưởng đến việc bạn xây dựng kiến trúc của các class.

Trừu tượng có nghĩ là tổng quát hóa một cái gì đó lên, không cần chú ý chi tiết bên trong. Nó không màng đến chi tiết bên trong là gì và người ta vẫn hiểu nó mỗi khi nghe về nó.

    Cái này mình đọc trên mạng, nhưng mình nghĩ có 2 điều cần quan tâm trong tính chất này để bạn hiểu rõ hơn tại sao cần trừu tượng trong lập trình.

- trừu tượng trong việc xây dựng các class base và đặt tên các phương thức

- trong việc giao tiếp giữa các class thông qua trừu tượng