Applicazione SOLID dei principi in Node.js

Single Responsibility Principle(SRP)

Questo principio afferma che una classe dovrebbe avere un solo motivo per cambiare, il che significa che ogni classe dovrebbe svolgere una funzione specifica.

Esempio: gestione dei dati utente e invio email di notifiche.

class UserManager {  
  constructor() {}  
    
  createUser(userData) {  
    // Logic for creating a user  
  }  
}  
  
class EmailService {  
  constructor() {}  
    
  sendEmail(emailData) {  
    // Logic for sending an email  
  }  
}  

Open/Closed Principle(OCP)

Questo principio incoraggia l'estensione della funzionalità aggiungendo nuovo codice anziché modificare il codice esistente.

Esempio: gestione di diversi metodi di pagamento in un'applicazione di e-commerce.

class PaymentProcessor {  
  processPayment() {  
    // Common logic for payment processing  
  }  
}  
  
class CreditCardPaymentProcessor extends PaymentProcessor {  
  processPayment() {  
    // Logic for processing credit card payment  
  }  
}  
  
class PayPalPaymentProcessor extends PaymentProcessor {  
  processPayment() {  
    // Logic for processing PayPal payment  
  }  
}  

Liskov Substitution Principle(LSP)

Questo principio afferma che gli oggetti di una classe derivata dovrebbero essere sostituibili con gli oggetti della classe base senza influire sulla correttezza del programma.

Esempio: gestione delle forme geometriche.

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;  
  }  
}  

Principio di segregazione dell'interfaccia(ISP)

Questo principio consiglia di suddividere le interfacce in interfacce più piccole per evitare di forzare le classi a implementare metodi di cui non hanno bisogno.

Esempio: interfacce per l'aggiornamento e la visualizzazione dei dati.

class UpdateableFeature {  
  updateFeature() {}  
}  
  
class DisplayableFeature {  
  displayFeature() {}  
}  

Dependency Inversion Principle(DIP)

Questo principio suggerisce che i moduli di alto livello non dovrebbero dipendere da moduli di basso livello; entrambi dovrebbero dipendere da astrazioni.

Esempio: Utilizzo dependency injection per gestire le dipendenze.

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

Ricorda, questi esempi sono solo illustrazioni di come applicare i SOLID principi in Node.js. In pratica, dovrai applicarli in modo flessibile in base allo scopo e alla portata del tuo progetto.