Interface Segregation Principle

(Zasada segregacji interfejsów)

Klienci nie powinni być zmuszani do korzystania z interfejsów (zależenia od interfejsów), których nie używają.

Robert C. Martin

Lepiej jest utworzyć kilka mniejszych (precyzyjniejszych) interfejsów zamiast jednego rozbudowanego (służącego do wielu czynności).

Na ekranie telefonu mamy ikony wielu aplikacji. Projektanci umożliwili nam przesuwanie tych ikon, abyśmy mieli pod ręką te aplikacje, których używamy często, a te rzadziej używane możemy przesunąć na kolejne ekrany.

</> Lepszy przykład niż wykład

✘ Błędny kod

W interfejsie Move utworzymy trzy metody odpowiedzialne za przemieszczanie się poprzez bieganie, fruwanie i pływanie.

public interface Move {
    void go();
    void fly();
    void swim();
}

W przypadku tak rozbudowanego interfejsu zmuszani jesteśmy do korzystania z kilku metod przemieszczania, których nie zawsze potrzebujemy. Gdy zaimplementujemy nasz interfejs w klasie Duck, wszystko zadziała prawidłowo, ponieważ kaczki chodzą, fruwają i pływają

public class Duck implements Move{
    @Override
    public void go() {
        System.out.println("Chodzę powoli.");
    }

    @Override
    public void fly() {
        System.out.println("Fruwam nieźle.");
    }

    @Override
    public void swim() {
        System.out.println("Bardzo dobrze pływam.");
    }
}

Ale w klasie Ostrich już niekoniecznie, przecież nikt nie wiedział latającego strusia.

public class Ostrich implements Move {
    @Override
    public void go() {
        System.out.println("Chodzę i biegam.");
    }

    @Override
    public void fly() {
        throw new RuntimeException("Nie potrafię latać!");
    }

    @Override
    public void swim() {
        System.out.println("Rzadko pływam.");
    }
}
✔ Prawidłowy kod

Należy rozdzielić rozbudowany interfejs Move na kilka mniejszych Go, Fly, Swim. Każda klasa będzie implementowała tylko te interfejsy, których potrzebuje.

public interface Go {
    void go();
}

public interface Fly {
    void fly();
}

public interface Swim {
    void swim();
}

public class Duck implements Go, Fly, Swim{
    @Override
    public void go() {
        System.out.println("Chodzę powoli.");
    }

    @Override
    public void fly() {
        System.out.println("Fruwam nieźle.");
    }

    @Override
    public void swim() {
        System.out.println("Bardzo dobrze pływam.");
    }
}

public class Ostrich implements Go, Swim {
    @Override
    public void go() {
        System.out.println("Chodzę i biegam.");
    }

    @Override
    public void swim() {
        System.out.println("Rzadko pływam.");
    }
}

Zostaw komentarz

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