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ą.

Scroll to Top