Sobes.tech
Senior

Portlar və adapterlərin memarlığı haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Portlar və adapterlər arxitekturası, həmçinin hexagonal arxitektura (Hexagonal Architecture) kimi də tanınır, tətbiqin domeni logikasını (Core) xarici asılılıqlardan (istifadəçi interfeysləri, verilənlər bazaları, xarici xidmətlər) ayırır.

Əsas konseptlər:

  • Portlar: Core ilə xarici dünya arasında interfeysləri müəyyən edir. Portlar iki növə bölünür:
    • Daxili portlar (Driving Ports): Xarici varlıqlar tərəfindən Core funksionallığını çağırmaq üçün istifadə olunur (məsələn, API interfeysi).
    • Xarici portlar (Driven Ports): Core tərəfindən xarici varlıqlara funksionallıq çağırmaq üçün istifadə olunur (məsələn, məlumatlara giriş üçün repository interfeysi).
  • Adapterlər: Portları həyata keçirir və Core-u xüsusi xarici texnologiyalar və ya framework-lərə bağlayır.
    • Daxili adapterlər (Driving Adapters): Daxili portları həyata keçirir və xarici mühitdən gələn sorğuları Core-ə çağırışlara çevirir (məsələn, REST controller).
    • Xarici adapterlər (Driven Adapters): Xarici portları həyata keçirir və Core-dən gələn çağırışları xarici mühitlə əlaqələndirir (məsələn, verilənlər bazası ilə işləmək üçün repository implementasiyası).
  • Core (Domen sahəsi): Tətbiqin biznes logikasını ehtiva edir. Tamamilə xarici detallardan izolyasiya olunub və onlarla yalnız portlar vasitəsilə əlaqə qurur.

Üstünlüklər:

  • Test ediləbilərlik: Core-in izolyasiyası biznes logikanın vahid testini asanlaşdırır və xarici kompleks asılılıqları mock etmək ehtiyacını aradan qaldırır.
  • Esneklik: Xarici texnologiyaları (verilənlər bazaları, frameworklər) asanlıqla dəyişdirməyə və ya əlavə etməyə imkan verir, Core-i dəyişdirmədən. Mövcud porta yeni adapter yazmaq kifayətdir.
  • Təmiz kod: Daha təmiz və saxlanması asan kod yaratmağa kömək edir, Core-i yalnız biznes qaydalarına yönəldir.
  • Məsuliyyətlərin bölünməsi: Məsuliyyət sahələrini aydın şəkildə ayırır.

Frontend ilə əlaqəsi:

Frontend-də portlar və adapterlər arxitekturası aşağıdakı üçün tətbiq olunur:

  • Komponentin biznes logikasını məlumat mənbələrindən ayırmaq: Komponentlər "port" ilə əlaqə qurur (interfeys), bu isə müxtəlif "adapter"lər tərəfindən həyata keçirilə bilər (API-dən, Local Storage-dən, test mock-lərindən məlumat almaq və s.).
  • Xarici hadisələrin işlənməsi: Daxili portlar UI hadisə handler-lərini təmsil edə bilər və adapterlər bu hadisələri daxili logikaya çağırışlara çevirir.
  • Xarici kitabxanalarla əlaqənin inkapsulyasiyası: Adapterlər xarici kitabxanalara (məsələn, xəritələrlə işləmək üçün kitabxana) müraciətləri əhatə edir və Core-ə sadə və stabil interfeys təqdim edir.

JavaScript-də nümunə (sxema):

// Xarici məlumat əldə etmək üçün port nümunəsi
class DataGateway {
  getData() {
    throw new Error("getData metodu həyata keçirilməlidir");
  }
}

// API üçün portu həyata keçirən adapter nümunəsi
class ApiDataGateway extends DataGateway {
  async getData() {
    const response = await fetch('/api/data');
    return response.json();
  }
}

// Biznes logikası üçün port nümunəsi
class BusinessLogicPort {
  constructor(dataGateway) {
    this.dataGateway = dataGateway;
  }

  async processData() {
    throw new Error("processData metodu həyata keçirilməlidir");
  }
}

// Core nümunəsi (biznes logika)
class MyBusinessLogic extends BusinessLogicPort {
  async processData() {
    const data = await this.dataGateway.getData();
    // Məlumatların işlənməsi logikası
    console.log("İşlənmiş məlumat:", data);
    return data;
  }
}

// UI-də logikanı istifadə edən daxili adapter nümunəsi
async function initApp() {
  const apiGateway = new ApiDataGateway(); // Konkret adapter
  const businessLogic = new MyBusinessLogic(apiGateway); // Core portu istifadə edir
  await businessLogic.processData(); // Daxili adapter Core-u çağırır
}

initApp();