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();