Sobes.tech
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();