Interface segregation principle

Teoria

Zasada segregacji interfejsów stwierdza, że żadna klasa nie powinna implementować kodu, którego nie używa ( nie potrzebuje). Można wyciągnąć z tego taki wniosek, że lepiej jest mieć kilka mniejszych interfejsów, niż jeden duży i chaotyczny.

Przykład

Rozważmy przypadek fabryki samochodów, która w swojej ofercie ma modele samochodów różnych klas.

public interface Car {

    void startUp();
    void headlightsOn();
    void navigation();
    void electricMirrors();
}




public class BudgetCar implements Car{

    @Override
    public void startUp() {
        System.out.println("Starting engine and all systems");
    }

    @Override
    public void headlightsOn() {
        System.out.println("Turning on headlights");
    }

    @Override
    public void navigation() {

    }

    @Override
    public void electricMirrors() {

    }
}



public class Limousine implements Car{

    @Override
    public void startUp() {
        System.out.println("Starting engine and all systems");
    }

    @Override
    public void headlightsOn() {
        System.out.println("Turning on headlights");
    }

    @Override
    public void navigation() {
        System.out.println("Turning on navigation system");
    }

    @Override
    public void electricMirrors() {
        System.out.println("Operating mirrors electrically");
    }
}

Limuzyna z oferty producenta samochodów posiada implementację wszystkich opcji jakie ma do zaoferowania marka. Problem pojawia się, gdy chcemy stworzyć wersję dostępna dla klientów z mniejszym portfelem, samochód w wariancie budżetowym ma nie zaimplementowane dwie metody, co niepotrzebnie zaśmieca kod i zmniejsza jego czytelność. Możemy temu zaradzić przez rozdzielenie dużego interfejsu Car na mniejsze.

public interface CoreFunctionalities {
    void startUp();
    void headlightsOn();
}


public interface Navigation {

    void navigation();
}


public interface ElectricMirrors {

    void electricMirrors();
}



public class BudgetCar implements CoreFunctionalities{
    @Override
    public void startUp() {
        System.out.println("Starting engine and all systems");
    }

    @Override
    public void headlightsOn() {
        System.out.println("Turning on headlights");
    }

}



public class Limousine implements CoreFunctionalities, Navigation, ElectricMirrors{

    @Override
    public void startUp() {
        System.out.println("Starting engine and all systems");
    }

    @Override
    public void headlightsOn() {
        System.out.println("Turning on headlights");
    }

    @Override
    public void navigation() {
        System.out.println("Turning on navigation system");
    }

    @Override
    public void electricMirrors() {
        System.out.println("Operating mirrors electrically");
    }
}

Zastosowanie zasady segregacji interfejsów pozwoliło nam na implementację tylko tych metod, które są niezbędne. Uzyskujemy większą elastyczność systemu i jak to zwykle bywa przy regułach SOLID, większą czytelność kodu.

Dodaj komentarz