Introduzione ai Principi SOLID: Interface Segregation Principle (ISP)

Scrivere codice modulare e scalabile con il Principio di Segregazione delle Interfacce in Laravel e PHP
Tempo lettura: 4 minuti, 56 secondi
Difficoltà: Intermedio

Il Principio di Segregazione delle Interfacce (ISP) è uno dei cinque principi SOLID, ideati da Robert C. Martin, e si concentra sul mantenere le interfacce piccole e focalizzate. Secondo questo principio, una classe non dovrebbe mai essere costretta a implementare metodi di cui non ha bisogno.

In questo articolo esploreremo l’ISP, capiremo perché è essenziale per scrivere codice manutenibile e scalabile, e vedremo esempi pratici di come applicarlo in PHP.


❓Cosa significa l’ISP?

Il principio si può riassumere così:

“I client non dovrebbero essere costretti a dipendere da metodi che non utilizzano.”

In pratica, significa che le interfacce devono essere specifiche per le esigenze di chi le implementa, evitando di creare interfacce generiche e troppo grandi che costringano le classi a implementare metodi inutili.


Perché è importante?


🧐 Un esempio concreto

Immaginiamo di dover implementare un sistema per una stampante multifunzione che può stampare, scannerizzare e inviare fax.

Ecco un’interfaccia che non segue l’ISP:

 

   interface MultiFunctionPrinter {

    public function printDocument(string $content);

    public function scanDocument(): string;

    public function sendFax(string $number, string $content);

}

 

Ora, supponiamo di avere una stampante economica che può solo stampare e non ha la funzione di scanner o fax. Sarebbe comunque costretta a implementare metodi inutili:

 

  class BasicPrinter implements MultiFunctionPrinter {

    public function printDocument(string $content) {

        echo "Stampo il documento: $content";

    }

 

 

    public function scanDocument(): string {

        throw new Exception("Questa stampante non supporta la scansione.");

    }

 

 

    public function sendFax(string $number, string $content) {

        throw new Exception("Questa stampante non supporta il fax.");

    }

}

 

Applicare l’ISP

Per risolvere questo problema, spezziamo l’interfaccia in più interfacce specifiche:

 

    interface Printer {

    public function printDocument(string $content);

}

 

 

    interface Scanner {

    public function scanDocument(): string;

}

 

 

    interface Fax {

    public function sendFax(string $number, string $content);

}

 

Ora ogni stampante può implementare solo le funzionalità che realmente supporta:

 

    class BasicPrinter implements Printer {

    public function printDocument(string $content) {

        echo "Stampo il documento: $content";

    }

}

 

 

    class AdvancedPrinter implements Printer, Scanner, Fax {

    public function printDocument(string $content) {

        echo "Stampo il documento: $content";

    }

 

 

    public function scanDocument(): string {

        return "Scansiono il documento.";

    }

 

 

    public function sendFax(string $number, string $content) {

        echo "Invio il fax a $number con il contenuto: $content";

    }

}

 

Vantaggi

La stampante base implementa solo l’interfaccia Printer, senza preoccuparsi di metodi inutili.

La stampante avanzata implementa tutte e tre le interfacce, utilizzando solo i metodi necessari.


Un altro esempio: Servizi di pagamento

Supponiamo di dover integrare un sistema di pagamento che supporta carte di credito, PayPal e bonifico bancario.

Ecco un’interfaccia troppo generica:

 

    interface PaymentService {

    public function payWithCreditCard(string $cardNumber, float $amount);

    public function payWithPayPal(string $email, float $amount);

    public function payWithBankTransfer(string $accountNumber, float $amount);

}

 

Un gateway che supporta solo le carte di credito sarebbe costretto a implementare metodi inutili:

 

    class CreditCardPaymentService implements PaymentService {

    public function payWithCreditCard(string $cardNumber, float $amount) {

        echo "Pagamento di $amount effettuato con carta $cardNumber.";

    }

 

 

    public function payWithPayPal(string $email, float $amount) {

        throw new Exception("Questo metodo di pagamento non è supportato.");

    }

 

 

    public function payWithBankTransfer(string $accountNumber, float $amount) {

        throw new Exception("Questo metodo di pagamento non è supportato.");

    }

}

 

Applicare l’ISP

Spezziamo l’interfaccia in più interfacce specifiche:

 

    interface CreditCardPayment {

    public function payWithCreditCard(string $cardNumber, float $amount);

}

 

 

   interface PayPalPayment {

    public function payWithPayPal(string $email, float $amount);

}

 

 

   interface BankTransferPayment {

    public function payWithBankTransfer(string $accountNumber, float $amount);

}

 

E ora implementiamo solo ciò che serve:

 

   class CreditCardPaymentService implements CreditCardPayment {

    public function payWithCreditCard(string $cardNumber, float $amount) {

        echo "Pagamento di $amount effettuato con carta $cardNumber.";

    }

}

 

 

    class PayPalPaymentService implements PayPalPayment {

    public function payWithPayPal(string $email, float $amount) {

        echo "Pagamento di $amount effettuato con PayPal ($email).";

    }

}

 


❓Domande frequenti

Domanda: Posso usare l’ISP in combinazione con altri principi SOLID?

Assolutamente sì! L’ISP si integra perfettamente con il Principio di Responsabilità Unica (SRP) e il Principio di Inversione delle Dipendenze (DIP), promuovendo un design modulare e manutenibile.

Domanda: Quando un’interfaccia è troppo grande?

Se un’interfaccia ha metodi che non tutti i suoi implementatori utilizzeranno, è probabilmente troppo grande e deve essere suddivisa.


Il Principio di Segregazione delle Interfacce (ISP) è fondamentale per creare codice flessibile, manutenibile e scalabile. Spezzare le interfacce in parti più piccole e specifiche consente alle classi di implementare solo ciò di cui hanno realmente bisogno, evitando dipendenze non necessarie.

Se hai trovato utile questa guida, considera di implementare il principio nei tuoi progetti e di condividerne i risultati!

Per qualsiasi domanda o per raccontare la tua esperienza con l’ISP, lascia un commento! 😊

Ricevi le ultime novità

Condividi:

Circa l'autore

Giuseppe Alessandro De Blasio

Salve il mio nome come avrete notato e Giueppe Alessandro De Blasio e questo è il mio blog, tutto nasce dalla passione per la tecnologia e per il web in generale, ed oggi lo utilizzo come mezzo di condivisione. Spero che la vostra permanenza sul mio blog vi sia utile e che decidiate di diventare miei affezionati lettori.

Commenti