Middle
Podľa akého princípu sa metódy v rozhraniach zoskupujú a oddeľujú?
sobes.tech AI
Odpoveď od AI
Metódy v rozhraní sa spájajú a delia podľa princípu súdržnosti správania (cohesion) a princípu jasnej zmluvnosti.
- Súdržnosť správania: Metódy, ktoré predstavujú jednotný súbor operácií s entitou alebo vykonávajú podobné akcie podľa zmyslu, sa spájajú do jedného rozhrania. To zlepšuje čitateľnosť kódu, uľahčuje pochopenie účelu rozhrania a zvyšuje jeho opakovateľnosť.
- Jasná zmluvnosť: Rozhranie opisuje jasnú zmluvu, ktorú musia plniť implementujúce ho triedy. Každá metóda v rozhraní je súčasťou tejto zmluvy. Metódy sa delia medzi rôzne rozhrania, ak predstavujú rôzne aspekty správania alebo ak ich implementácia môže byť nezávislá. Napríklad, rozhranie
Readablemôže obsahovať metódy na čítanie dát, aWritable— na zápis. Trieda môže implementovať jedno alebo obe tieto rozhrania v závislosti od svojich možností.
Tento prístup prispieva k princípom SOLID, najmä:
- Princíp jednotnej zodpovednosti (Single Responsibility Principle): Rozhranie má jeden dôvod na zmenu — zmenu súboru správaní, ktoré opisuje.
- Princíp rozdeľovania rozhraní (Interface Segregation Principle): Klienti by nemali závisieť od rozhraní, ktoré nepoužívajú. Rozdeľovanie veľkých rozhraní na menšie a zamerané umožňuje triedam implementovať len tie rozhrania, ktoré naozaj potrebujú.
Príklad:
Predpokladajme, že máme entitu, ktorá môže byť uložená a načítaná. Namiesto jedného rozhrania Persistable s dvoma metódami save() a load(), je lepšie vytvoriť dve samostatné:
<?php
// Rozhranie pre entity, ktoré je možné ukladať
interface Savable
{
public function save(): void;
}
<?php
// Rozhranie pre entity, ktoré je možné načítať
interface Loadable
{
public function load(): void;
}
Trieda, ktorá môže a má byť uložená aj načítaná, implementuje obe rozhrania:
<?php
// Trieda implementujúca obe rozhrania
class DataObject implements Savable, Loadable
{
public function save(): void
{
// Logika uloženia
}
public function load(): void
{
// Logika načítania
}
}
Trieda, ktorá sa iba ukladá, implementuje iba Savable:
<?php
// Trieda implementujúca iba rozhranie Savable
class TempData implements Savable
{
public function save(): void
{
// Logika uloženia dočasných dát
}
}
Toto umožňuje flexibilnejšie navrhovanie tried a ich závislostí.