Áp Dụng Nguyên Tắc SOLID Trong Node.js

Single Responsibility Principle (SRP)

Nguyên tắc này nêu rõ rằng một class nên chỉ có một lý do để thay đổi, có nghĩa là mỗi class nên thực hiện một chức năng cụ thể.

Ví dụ: Quản lý người dùng và gửi email thông báo.

class UserManager {
  constructor() {}
  
  createUser(userData) {
    // Logic để tạo người dùng
  }
}

class EmailService {
  constructor() {}
  
  sendEmail(emailData) {
    // Logic để gửi email
  }
}

Open/Closed Principle (OCP)

Nguyên tắc này khuyến khích việc mở rộng chức năng bằng cách thêm code mới thay vì sửa đổi code cũ.

Ví dụ: Xử lý các phương thức thanh toán khác nhau trong ứng dụng thương mại điện tử.

class PaymentProcessor {
  processPayment() {
    // Logic chung cho xử lý thanh toán
  }
}

class CreditCardPaymentProcessor extends PaymentProcessor {
  processPayment() {
    // Logic xử lý thanh toán bằng thẻ tín dụng
  }
}

class PayPalPaymentProcessor extends PaymentProcessor {
  processPayment() {
    // Logic xử lý thanh toán qua PayPal
  }
}

Liskov Substitution Principle (LSP)

Nguyên tắc này khẳng định rằng đối tượng của lớp con nên có thể thay thế được đối tượng của lớp cha mà không làm thay đổi tính đúng đắn của chương trình.

Ví dụ: Quản lý các hình dạng hình học.

class Shape {
  area() {}
}

class Rectangle extends Shape {
  constructor(width, height) {}
  
  area() {
    return this.width * this.height;
  }
}

class Square extends Shape {
  constructor(side) {}
  
  area() {
    return this.side * this.side;
  }
}

Interface Segregation Principle (ISP)

Nguyên tắc này khuyến khích việc chia nhỏ các giao diện để tránh việc các class phải triển khai những phương thức không liên quan đến mục đích của chúng.

Ví dụ: Giao diện cho tính năng cập nhật và hiển thị dữ liệu.

class UpdateableFeature {
  updateFeature() {}
}

class DisplayableFeature {
  displayFeature() {}
}

Dependency Inversion Principle (DIP)

Nguyên tắc này đề xuất rằng các module cấp cao không nên phụ thuộc vào các module cấp thấp, cả hai nên phụ thuộc vào abstraction.

Ví dụ: Sử dụng dependency injection để quản lý phụ thuộc.

class OrderProcessor {
  constructor(dbConnection, emailService) {
    this.dbConnection = dbConnection;
    this.emailService = emailService;
  }
}

Nhớ rằng, các ví dụ này chỉ là minh họa cách áp dụng các nguyên tắc SOLID trong Node.js. Trong thực tế, bạn sẽ cần áp dụng chúng một cách linh hoạt tùy theo mục đích và quy mô của dự án của bạn.