Zasada segregacji interfesjów – Interface Segragation Principle (ISP)
Klienici nie powinni być zmuszani do implementowania interfejsów, których nie potrzebują. Lepiej tworzyć mniejsze specyficzne interfesjy niż tworzyć jeden duży, ogólny.
Zasada ta przeciwdziała sytuacji gdzie klasy implementują metody, których nie używają, co prowadzi do nadmiarowego i trudnego do utrzymania kodu.
Przykład złamania zasady:
// Mamy interfejs, który definiuje kilka metod
interface Zwierze {
void biegaj();
void latanie();
void plywaj();
}
// Następnie tworzymy dwie klasy Pies i Ptak, które implementują ten interfejs
class Pies implements Zwierze {
public void biegaj() {
System.out.println("Pies biega");
}
public void latanie() {
// Pies nie umie latać, ale musi zaimplementować tę metodę
}
public void plywaj() {
System.out.println("Pies pływa");
}
}
class Ptak implements Zwierze {
public void biegaj() {
System.out.println("Ptak biega");
}
public void latanie() {
System.out.println("Ptak lata");
}
public void plywaj() {
// Nie każdy ptak pływa, ale musi zaimplementować tę metodę
}
}
W tym przypadku zarówno klasa Pies, jak i klasa Ptak muszą implementować wszystkie metody, nawet jeśli nie każda z nich ma sens dla danego zwierzęcia (np. pies nie lata, a nie każdy ptak pływa). To narusza zasadę segregacji interfejsów, ponieważ klasy są zmuszane do implementowania metod, których nie potrzebują.
Poprawne zastosowanie zasady:
// Lepiej jest podzielić interfejs na mniejsze, bardziej specyficzne interfejsy
interface BiegajaceZwierze {
void biegaj();
}
interface LatajaceZwierze {
void latanie();
}
interface PlywajaceZwierze {
void plywaj();
}
// Teraz klasy Pies i Ptak mogą implementować tylko te interfejsy, które odpowiadają ich rzeczywistym zdolnościom
class Pies implements BiegajaceZwierze, PlywajaceZwierze {
public void biegaj() {
System.out.println("Pies biega");
}
public void plywaj() {
System.out.println("Pies pływa");
}
}
class Ptak implements BiegajaceZwierze, LatajaceZwierze {
public void biegaj() {
System.out.println("Ptak biega");
}
public void latanie() {
System.out.println("Ptak lata");
}
}
Dzięki temu klasy są bardziej czytelne, łatwiejsze w utrzymaniu i implementują tylko te metody, które faktycznie potrzebują. Zasada segregacji interfejsów pomaga tworzyć bardziej elastyczny i modularny kod, co przekłada się na lepsze zarządzanie złożonością oprogramowania.