Lập trình hướng đối tượng (OOP) là gì? Bốn trụ cột bạn cần biết

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Khi chương trình lớn dần, hàng nghìn hàm và biến rải rác sẽ rối như tơ vò. Lập trình hướng đối tượng (OOP) đưa ra cách tổ chức khác: gom dữ liệu và hành vi liên quan vào cùng một "đối tượng" mô phỏng thế giới thực.

Ý tưởng chính của OOP

Thay vì nghĩ "có dữ liệu và có hàm xử lý", OOP nghĩ "có những thực thể, mỗi thực thể tự biết nó có gì và làm được gì". Ví dụ trong game có nhân vật, kẻ thù, vật phẩm. Mỗi loại có thuộc tính (máu, vị trí) và hành động (di chuyển, tấn công).

  • Lớp (class): bản thiết kế, mô tả thuộc tính và phương thức.
  • Đối tượng (object): một thể hiện cụ thể được tạo từ lớp.
class NhanVat:
    def __init__(self, ten, mau):
        self.ten = ten
        self.mau = mau

    def nhan_sat_thuong(self, luong):
        self.mau = max(0, self.mau - luong)

a = NhanVat("Hiệp sĩ", 100)
a.nhan_sat_thuong(30)
print(a.ten, a.mau)   # Hiệp sĩ 70

Trụ cột 1: Đóng gói (Encapsulation)

Đóng gói là giấu chi tiết bên trong, chỉ để lộ những gì cần thiết. Bạn lái xe bằng vô lăng và chân ga mà không cần chạm vào động cơ. Với code, ta bảo vệ dữ liệu khỏi bị sửa tùy tiện:

class TaiKhoan:
    def __init__(self, so_du):
        self._so_du = so_du      # quy ước: không đụng trực tiếp

    def rut(self, tien):
        if tien <= 0 or tien > self._so_du:
            raise ValueError("Số tiền không hợp lệ")
        self._so_du -= tien

    @property
    def so_du(self):
        return self._so_du

Mọi thay đổi số dư đều đi qua rut, nơi có kiểm tra. Nhờ vậy dữ liệu luôn hợp lệ.

Trụ cột 2: Kế thừa (Inheritance)

Lớp con thừa hưởng thuộc tính và phương thức của lớp cha, đồng thời bổ sung hoặc thay đổi theo ý mình. Kế thừa giúp tái sử dụng code và thể hiện quan hệ "là một": Chó là một Động vật.

class DongVat:
    def __init__(self, ten):
        self.ten = ten
    def keu(self):
        return "..."

class Cho(DongVat):
    def keu(self):
        return "Gâu gâu"

Trụ cột 3: Đa hình (Polymorphism)

Đa hình cho phép cùng một lời gọi nhưng hành vi tùy thuộc loại đối tượng:

class Meo(DongVat):
    def keu(self):
        return "Meo meo"

for con in [Cho("Vàng"), Meo("Mướp"), DongVat("Lạ")]:
    print(con.ten, ":", con.keu())

Đoạn code gọi keu() mà không cần biết con vật cụ thể, nên khi thêm loại mới bạn không phải sửa vòng lặp.

Trụ cột 4: Trừu tượng (Abstraction)

Trừu tượng là tập trung vào "làm gì" thay vì "làm thế nào". Người dùng lớp chỉ cần biết các phương thức công khai. Trong thực tế, ta thể hiện bằng lớp trừu tượng hoặc interface, quy định các phương thức mà lớp con bắt buộc cung cấp.

OOP giúp gì cho dự án?

  • Code có tổ chức, dễ chia việc cho nhiều người.
  • Thay đổi một phần ít ảnh hưởng phần khác.
  • Dễ mô hình hóa các bài toán đời thực như game, quản lý, thương mại điện tử.

Những hiểu lầm thường gặp

  1. OOP không phải lúc nào cũng tốt hơn. Với script ngắn, vài hàm đơn giản là đủ.
  2. Kế thừa bị lạm dụng. Chuỗi kế thừa sâu khó hiểu; nhiều chuyên gia khuyên ưu tiên ghép (composition) khi có thể.
  3. Không phải ngôn ngữ nào cũng giống nhau. Java, C#, C++, Python đều hỗ trợ OOP nhưng cú pháp và triết lý có khác biệt.

Khi nào nên dùng OOP, khi nào không?

OOP phát huy sức mạnh khi chương trình có nhiều thực thể với trạng thái và hành vi gắn liền: game, hệ thống quản lý, giao diện người dùng. Nó ít cần thiết với script xử lý dữ liệu một lần, nơi vài hàm thuần túy rõ ràng hơn. Ba dấu hiệu cho thấy nên chuyển sang OOP:

  1. Bạn truyền đi truyền lại cùng một nhóm biến giữa nhiều hàm.
  2. Có nhiều biến thể của cùng một khái niệm (nhiều loại thanh toán, nhiều loại kẻ thù).
  3. Có dữ liệu cần được bảo vệ quy tắc hợp lệ (số dư không âm).

Ví dụ nhóm biến đi cùng nhau:

# trước: ba biến rời rạc
ten, mau, vi_tri = "Quái", 50, (3, 4)

# sau: gói thành một đối tượng
class Quai:
    def __init__(self, ten, mau, vi_tri):
        self.ten, self.mau, self.vi_tri = ten, mau, vi_tri

Hãy bắt đầu nhỏ: chuyển một nhóm biến và các hàm liên quan trong dự án cũ của bạn thành một lớp, sau đó xem code gọi nó có gọn hơn không.

Kết luận

Bốn trụ cột đóng gói, kế thừa, đa hình, trừu tượng là bộ khung để suy nghĩ về thiết kế phần mềm. Hãy bắt đầu bằng một mini dự án như quản lý thư viện sách hoặc game đấu sĩ đơn giản, bạn sẽ hiểu rõ hơn khi tự tay tổ chức các lớp.

Học xong lý thuyết, hãy thực hành thật nhiều; các bài giảng có bài tập trong khóa học codebem.com sẽ giúp bạn việc đó.

author_photo
Nguyễn Đình Cường

0 comment