Wiele dedykowanych interfejsów jest lepsze niż jeden ogólny.

Wprowadzenie

Czwartą zasadą SOLID jest zasada segregacji interfejsów. Zgodnie z tą zasadą nie powinniśmy wymuszać implementacji interfejsów, które nie są używane. Powinniśmy tworzyć więcej małych interfejsów niż jeden duży i zbyt ogólny. Programowanie zgodnie z tą zasadą pozwala uniknąć niepotrzebnej ilości, nadmiarowych metod, z których niekoniecznie będziemy korzystać.

Aby lepiej zobrazować, na czym polega zasada segregacji interfejsów, posłużę się przykładami.

Przykład 1
Błędny kod

Mamy interfejs – Exportable, który pozwala nam wyeksportować coś do formatu PDF oraz do formatu CSV. Posiadam również klasę Invoice oraz CreditNote. Obie te klasy implementują interfejs Exportable.

interface Exportable
{
    public function getPDF();
    public function getCSV();
}
class Invoice implements Exportable
{
    public function getPDF() {
        // ...
    }
    public function getCSV() {
        // ...
    }
}
class CreditNote implements Exportable
{
    public function getPDF() {
        throw new \NotUsedFeatureException();
    }
    public function getCSV() {
        // ...
    }
}

Fakturę można pobrać w formacie PDF oraz CSV. Jednak pobranie noty w formacie PDF było bezużyteczne, więc funkcja getPDF() w klasie CreditNote zwraca wyjątek.

Zgodnie z zasadą segregacji interfejsów nie powinniśmy zmuszać naszych klas do implementowania metod, których nie używają. W tym przykładzie wymusiliśmy to na klasie CreditNote.

Poprawny kod
interface ExportablePdf
{
    public function getPDF();
}
interface ExportableCSV
{
    public function getCSV();
}
class Invoice implements ExportablePdf, ExportableCSV
{
    public function getPDF() {
        //
    }
    public function getCSV() {
        //
    }
}
class CreditNote implements ExportableCSV
{
    public function getCSV() {
        //
    }
}

Rozdzieliliśmy interfejsy. Z interfejsu Exportable tworzymy dwa mniejsze interfejsy: ExportablePdf oraz ExportableCSV. Teraz klasa CreditNote nie implementuje nieużywanej funkcji getPDF().

Podsumowanie

Stosując zasadę segregacji interfejsów, unikamy wymuszania implementacji niepotrzebnych metod. Pamiętajmy, aby unikać rozbudowanych interfejsów, które dostarczają nam wielu niejasności i problemów. Lepszym rozwiązaniem jest budowanie wielu, ale krótkich i zwięzłych interfejsów.


1 komentarz

Single Responsibility Principle – Natalia Galicka · 2023-10-23 o 12:30

[…] Zasada segregacji interfejsów (ISP – Interface Segregation Principle) […]

Skomentuj Single Responsibility Principle – Natalia Galicka Anuluj pisanie odpowiedzi

Avatar placeholder

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *