DDevArchive
Đăng nhập

OOP và Functional Programming: hai lối tư duy

Cùng một bài toán, hai trường phái giải khác nhau. OOP gom dữ liệu và hành vi vào "đối tượng". Functional tách sạch dữ liệu và hàm xử lý. Biết cả hai để đọc được code của mọi công ty.

OOP: thế giới là các đối tượng

Một đối tượng gom trạng thái (thuộc tính) và hành vi (phương thức). Dùng class để tạo khuôn, new để đúc ra từng “cá thể” cụ thể.

// File: oop.ts
class User {
  constructor(name, role) {
    this.name = name;
    this.role = role;
  }
  canEnroll(course) {
    return this.role !== 'guest';
  }
}

const minh = new User('Minh', 'student');
console.log(minh.canEnroll({ title: 'Foundation' })); // true
Bẫy của người mới với OOP

Đừng tạo class khi chỉ cần một object đơn giản. const user = { name: “Minh”, role: “student” } là đủ. OOP sinh ra để giải quyết bài toán kích thước, không phải để “cho thật giống Java”.

Functional: hàm là công dân hạng nhất

Hàm có thể gán vào biến, truyền làm tham số, trả về từ hàm khác. Dữ liệu được biến đổi qua chuỗi hàm map/filter/reduce thay vì sửa trực tiếp.

// File: fp.js
const scores = [7, 9, 5, 10, 6];

const passed = scores
  .filter(s => s >= 8)     // giữ điểm >= 8
  .map(s => s * 2)         // mỗi điểm nhân đôi
  .reduce((a, b) => a + b, 0); // cộng dồn

console.log(passed); // (9*2) + (10*2) = 38

Mấu chốt của phong cách functional: không sửa dữ liệu gốc. filter trả về mảng mới, scores vẫn nguyên vẹn. Điều này giúp code dễ kiểm thử và dễ suy luận.

Đặc điểmOOPFunctional
Đơn vị tổ chứcĐối tượng (dữ liệu + hành vi)Hàm thuần (dữ liệu vào → dữ liệu ra)
Sửa dữ liệuCho phép, qua methodTránh, dùng giá trị bất biến
Khi nào nên dùngHệ thống lớn, nghiệp vụ phức tạp, có stateXử lý dữ liệu, pipeline, logic tách bạch
Điển hìnhJava, C#, RubyHaskell, Elixir, phong cách JS hiện đại

Thực tế: dùng cả hai, đừng cuồng một bên

React dùng functional component nhưng có hooks quản lý state. TypeScript có class nhưng hầu hết code mới dùng object + function. Công ty thực tế không “thuần” — họ dùng công cụ phù hợp cho từng lớp của hệ thống.

❓ Đâu là điểm khác biệt cốt lõi giữa hai phong cách?

  • Viết được class với constructor và method
  • Dùng thành thạo map / filter / reduce
  • Biết giải thích vì sao hàm thuần dễ test
  • Không ép dùng OOP cho bài toán 5 dòng