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
Đừ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ểm | OOP | Functional |
|---|---|---|
| Đơ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ệu | Cho phép, qua method | Tránh, dùng giá trị bất biến |
| Khi nào nên dùng | Hệ thống lớn, nghiệp vụ phức tạp, có state | Xử lý dữ liệu, pipeline, logic tách bạch |
| Điển hình | Java, C#, Ruby | Haskell, 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