Senior
Čo viete o architektúre portov a adaptérů?
sobes.tech AI
Odpoveď od AI
Architektúra portov a adaptérov, známa aj ako hexagonálna architektúra (Hexagonal Architecture), oddelí logiku domény aplikácie (Core) od externých závislostí (užívateľské rozhrania, databázy, externé služby).
Hlavné koncepty:
- Porty: Definujú rozhrania, ktorými Core komunikuje s vonkajším svetom. Porty sú dva typy:
- Vstupné (Driving Ports): Používajú ich externé entity na volanie funkcií Core (napríklad API rozhranie).
- Výstupné (Driven Ports): Používajú ich Core na volanie funkcií externých entít (napríklad rozhranie repository pre prístup k dátam).
- Adaptéry: Implementujú porty, spájajú Core s konkrétnymi externými technológiami alebo frameworkmi.
- Vstupné (Driving Adapters): Implementujú vstupné porty a transformujú požiadavky z vonkajšieho prostredia na volania do Core (napríklad REST kontrolér).
- Výstupné (Driven Adapters): Implementujú výstupné porty a transformujú volania z Core na komunikáciu s vonkajším prostredím (napríklad implementácia repository pre prácu s konkrétnou databázou).
- Core (Domenové): Obsahuje biznis logiku aplikácie. Je úplne izolované od vonkajších detailov a komunikuje s nimi iba cez porty.
Výhody:
- Testovateľnosť: Izolácia Core uľahčuje jednotkové testovanie biznis logiky bez potreby mockovania zložitých externých závislostí.
- Flexibilita: Umožňuje ľahko nahradiť alebo pridať nové externé technológie (databázy, frameworky) bez zmeny Core. Stačí napísať nový adaptér pre existujúci port.
- Čistý kód: Prispieva k vytváraniu čistejšieho a udržiavateľnejšieho kódu, zameriavajúc sa len na biznis pravidlá.
- Rozdelenie zodpovedností: Jasne rozdeľuje zóny zodpovednosti.
Väzba s Frontendom:
V architektúre frontendu sa porty a adaptéry používajú na:
- Oddelenie biznis logiky komponentu od zdrojov dát: Komponent komunikuje s "portom" (rozhraním), ktorý môže byť implementovaný rôznymi "adaptérmi" (prijímajúcimi dáta z API, Local Storage, testovými mockmi a pod.).
- Spracovanie externých udalostí: Vstupné porty môžu predstavovať spracovateľov udalostí UI, adaptéry tieto udalosti transformujú na volania vnútornej logiky.
- Inkapsulácia komunikácie s externými knižnicami: Adaptéry môžu obaliť volania k externým knižniciam (napríklad knižnici na prácu s mapami), poskytujúc Core jednoduché a stabilné rozhranie.
Príklad v JavaScripte (schéma):
// Príklad výstupného portu (rozhranie na získanie dát)
class DataGateway {
getData() {
throw new Error("Metóda getData musí byť implementovaná");
}
}
// Príklad výstupného adaptéra (implementácia portu pre API)
class ApiDataGateway extends DataGateway {
async getData() {
const response = await fetch('/api/data');
return response.json();
}
}
// Príklad vstupného portu (rozhranie pre biznis logiku)
class BusinessLogicPort {
constructor(dataGateway) {
this.dataGateway = dataGateway;
}
async processData() {
throw new Error("Metóda processData musí byť implementovaná");
}
}
// Príklad Core (biznis logika)
class MyBusinessLogic extends BusinessLogicPort {
async processData() {
const data = await this.dataGateway.getData();
// Logika spracovania dát
console.log("Dáta spracované:", data);
return data;
}
}
// Príklad vstupného adaptéra (použitie logiky v UI)
async function initApp() {
const apiGateway = new ApiDataGateway(); // Konkrétny adaptér
const businessLogic = new MyBusinessLogic(apiGateway); // Core používa port
await businessLogic.processData(); // Vstupný adaptér volá Core
}
initApp();