Interface Segregation Principle (ISP)
Czwartą zasadą kryjącą się pod literą I w skrócie SOLID jest Reguła Segregacji Interfejsów. ISP czyli Interface Segregation Principle mówi o tym, że klient nie powinien być zmuszany do polegania na metodach, których nie używa. Innymi słowy, kilka mniejszych interfejsów z odpowiednimi metodami jest lepsze niż jeden ogólny, zawierający kilka metod niekoniecznie potrzebne.
Przykład kodu niestosującego się do zasady segregacji interfejsów:
public interface IGeneratorRaportow {
void GenerujPdf();
void GenerujExcel();
}
public class RaportWyplaty implements IGeneratorRaportow {
@Override
public void GenerujPdf() {
System.out.println(“Generuję plik PDF”);
}
@Override
public void GenerujExcel() {
System.out.println(“Generuję plik Excel”);
}
}
public class Faktura implements IGeneratorRaportow {
@Override
public void GenerujPdf() {
System.out.println(“Generuję plik PDF”);
}
@Override
public void GenerujExcel() {
throw new NotImplementedException();
}
}
W powyższym przykładzie mamy interfejs IGeneratorRaportow, który posiada dwie metody GenerujPdf() oraz GenerujExcel(). Klasa implementująca dany interfejs musi również zaimplementować jego metody. W klasie RaportWyplaty implementacja interfejsu przebiegła poprawnie, ponieważ dla raportu wypłaty jest możliwość wygenerowania pliku pdf oraz excel. Natomiast w klasie Faktura potrzebujemy jedynie metody generującej plik PDF, a w metodzie GenerujExcel() zostanie rzucony wyjątek. Ta sytuacja świadczy o naruszeniu reguły segregacji interfejsów.
Przykład poprawnego kodu:
public interface IGeneratorPdf {
void GenerujPdf();
}
public interface IGeneratorExcel {
void GenerujExcel();
}
public class RaportWyplaty implements IGeneratorPdf, IGeneratorExcel {
@Override
public void GenerujPdf() {
System.out.println(“Generuję plik PDF”);
}
@Override
public void GenerujExcel() {
System.out.println(“Generuję plik Excel”);
}
}
public class Faktura implements IGeneratorPdf {
@Override
public void GenerujPdf() {
System.out.println(“Generuję plik PDF”);
}
}
Nasz ogólny interfejs IGeneratorRaportow został podzielony na dwa mniejsze interfejsy z bardziej dedykowanymi metodami: IGeneratorPdf i IGeneratorExcel. Obecnie nasze klasy implementują tylko te interfejsy, których metody potrzebują.