4. Zasada segregacji interfejsów
Zasada segregacji interfejsów (Interface Segregation Principle, ISP).
Mówi ona, że klient nie powinien być zmuszany do implementacji interfejsów, których nie używa.
Zamiast tego, lepiej jest tworzyć małe, specjalizowane interfejsy, które są dostosowane do konkretnych potrzeb klienta.
Poniżej znajdziesz przykład zasady ISP. Załóżmy, że mamy interfejs
Zamiast tego, lepiej jest tworzyć małe, specjalizowane interfejsy, które są dostosowane do konkretnych potrzeb klienta.
Poniżej znajdziesz przykład zasady ISP. Załóżmy, że mamy interfejs
Worker, który zawiera metody związane zarówno z pracą biurową, jak i z pracą na produkcji.Java
// Klasa łamiąca zasadę ISP
interface Worker {
void doOfficeWork();
void doProductionWork();
}
class OfficeWorker implements Worker {
@Override
public void doOfficeWork() {
// logika związana z pracą biurową
System.out.println("Doing office work");
}
@Override
public void doProductionWork() {
// logika związana z pracą na produkcji
System.out.println("Doing production work");
}
}
class FactoryWorker implements Worker {
@Override
public void doOfficeWork() {
// logika związana z pracą biurową
System.out.println("Doing office work");
}
@Override
public void doProductionWork() {
// logika związana z pracą na produkcji
System.out.println("Doing production work");
}
}
public class Main {
public static void main(String[] args) {
// Użycie klasy łamiącej zasadę ISP
Worker officeWorker = new OfficeWorker();
officeWorker.doOfficeWork();
officeWorker.doProductionWork();
Worker factoryWorker = new FactoryWorker();
factoryWorker.doOfficeWork();
factoryWorker.doProductionWork();
}
}W powyższym przykładzie obie klasy, OfficeWorker i FactoryWorker, muszą implementować obie metody interfejsu Worker, chociaż każda z nich używa tylko jednej z tych metod. To łamie zasadę segregacji interfejsów.
Aby naprawić naruszenie zasady ISP, możemy stworzyć osobne interfejsy dla pracowników biurowych i pracowników na produkcji:
Java
// Poprawione zastosowanie zasady ISP
interface OfficeWorker {
void doOfficeWork();
}
interface FactoryWorker {
void doProductionWork();
}
class OfficeWorkerImpl implements OfficeWorker {
@Override
public void doOfficeWork() {
// logika związana z pracą biurową
System.out.println("Doing office work");
}
}
class FactoryWorkerImpl implements FactoryWorker {
@Override
public void doProductionWork() {
// logika związana z pracą na produkcji
System.out.println("Doing production work");
}
}
public class Main {
public static void main(String[] args) {
// Użycie poprawionego zastosowania zasady ISP
OfficeWorker officeWorker = new OfficeWorkerImpl();
officeWorker.doOfficeWork();
FactoryWorker factoryWorker = new FactoryWorkerImpl();
factoryWorker.doProductionWork();
}
}W tym przypadku mamy osobne interfejsy OfficeWorker i FactoryWorker, które są implementowane przez odpowiednie klasy.
To spełnia zasadę segregacji interfejsów, ponieważ klient nie jest zmuszany do implementacji metod, których nie używa.