Middle
Na jakiej zasadzie metody są grupowane i oddzielane w interfejsach?
sobes.tech AI
Odpowiedź od AI
Metody w interfejsach są grupowane i rozdzielane zgodnie z zasadą spójności zachowania i zasadą jawnego kontraktu.
- Spójność zachowania: Metody reprezentujące zbiór operacji na encji lub wykonujące podobne działania są łączone w jeden interfejs. To poprawia czytelność kodu, ułatwia zrozumienie celu interfejsu i zwiększa jego ponowne użycie.
- Jawny kontrakt: Interfejs opisuje jawny kontrakt, który muszą spełniać klasy go implementujące. Każda metoda w interfejsie jest częścią tego kontraktu. Metody są rozdzielane między różne interfejsy, jeśli reprezentują różne aspekty zachowania lub jeśli ich implementacja może się różnić niezależnie. Na przykład, interfejs
Readablemoże zawierać metody do odczytu danych, aWritabledo zapisu. Klasa może implementować jeden lub oba te interfejsy w zależności od swoich możliwości.
To podejście wspiera zasady SOLID, w szczególności:
- Zasada pojedynczej odpowiedzialności: Interfejs ma jeden powód do zmiany — zmiana zestawu zachowań, które opisuje.
- Zasada segregacji interfejsów: Klienci nie powinni zależeć od interfejsów, których nie używają. Podział dużych interfejsów na mniejsze i skupione pozwala klasom implementować tylko te interfejsy, które są im naprawdę potrzebne.
Przykład:
Załóżmy, że mamy encję, którą można zapisać i odczytać. Zamiast jednego interfejsu Persistable z dwoma metodami save() i load(), lepiej utworzyć dwa oddzielne:
// Interfejs dla encji, które można zapisać
interface Savable
{
public function save(): void;
}
// Interfejs dla encji, które można odczytać
interface Loadable
{
public function load(): void;
}
Klasa, która może być zapisana i odczytana, implementuje oba interfejsy:
// Klasa implementująca oba interfejsy
class DataObject implements Savable, Loadable
{
public function save(): void
{
// Logika zapisu
}
public function load(): void
{
// Logika odczytu
}
}
Klasa, która jest tylko zapisywana, implementuje tylko Savable:
// Klasa implementująca tylko interfejs Savable
class TempData implements Savable
{
public function save(): void
{
// Logika zapisywania tymczasowych danych
}
}
To pozwala na bardziej elastyczne projektowanie klas i ich zależności.