Senior
Portlar va adapterlar arxitekturasi haqida nima bilasiz?
sobes.tech AI
AIdan javob
Hexagonal arxitektura (Portlar va Adaptörlar arxitekturasi) deb ham ataladigan, bu arxitektura, ilovaning domenik mantiqini (Core) tashqi bog'liqliklardan (foydalanuvchi interfeyslari, ma'lumotlar bazalari, tashqi xizmatlar) ajratadi.
Asosiy tushunchalar:
- Portlar: Core ning tashqi dunyo bilan o'zaro ta'sir qiladigan interfeyslarini belgilaydi. Portlar ikki turga bo'linadi:
- Kirish (Driving Ports): Tashqi sub'ektlar tomonidan Core funksiyalarini chaqirish uchun ishlatiladi (masalan, API interfeysi).
- Chiqish (Driven Ports): Core tomonidan tashqi sub'ektlarning funksiyalarini chaqirish uchun ishlatiladi (masalan, ma'lumotlarga kirish uchun repository interfeysi).
- Adaptörlar: Portlarni amalga oshiradi va Core ni tashqi texnologiyalar yoki framework'lar bilan bog'laydi.
- Kirish (Driving Adapters): Kirish portlarini amalga oshiradi va tashqi so'rovlarni Core chaqiruvlariga aylantiradi (masalan, REST controller).
- Chiqish (Driven Adapters): Chiqish portlarini amalga oshiradi va Core chaqiruvlarini tashqi muhit bilan o'zaro ta'sir qilish uchun aylantiradi (masalan, ma'lumotlar bazasi bilan ishlash uchun repository amalga oshirish).
- Core (Domen): Ilovaning biznes mantiqini o'z ichiga oladi. U to'liq tashqi tafsilotlardan ajratilgan va ular bilan faqat portlar orqali muloqot qiladi.
Afzalliklar:
- Test qilish imkoniyati: Core ning izolatsiyasi, murakkab tashqi bog'liqliklarni mock qilish shart emas, biznes mantiqining birlik testlarini osonlashtiradi.
- Moslashuvchanlik: Yangi tashqi texnologiyalarni (ma'lumotlar bazalari, framework'lar) Core ni o'zgartirmasdan osonlik bilan almashtirish yoki qo'shish imkonini beradi. Mavjud port uchun yangi adaptör yozish kifoya.
- Toza kod: Toza va saqlashga qulay kod yaratishni rag'batlantiradi, faqat biznes qoidalariga e'tibor qaratadi.
- Mas'uliyatlarni ajratish: Mas'uliyat sohalarini aniq ajratadi.
Frontend bilan bog'liqligi:
Frontendda, portlar va adaptörlar arxitekturasi quyidagi maqsadlar uchun qo'llaniladi:
- Komponentning biznes mantiqini ma'lumot manbalaridan ajratish: Komponent "port" (interfeys) bilan muloqot qiladi, uni turli "adaptörlar" (API dan ma'lumot olish, Local Storage, mocklar va boshqalar) amalga oshirishi mumkin.
- Tashqi voqealarni boshqarish: Kirish portlari UI voqealarini boshqaruvchi sifatida xizmat qilishi mumkin, va adaptörlar bu voqealarni ichki mantiq chaqiruvlariga aylantiradi.
- Tashqi kutubxonalar bilan muloqotni inkapsulyatsiya qilish: Adaptörlar, tashqi kutubxonalar chaqiruvlarini o'z ichiga olishi mumkin (masalan, xaritalar bilan ishlash kutubxonasi), Core uchun oddiy va barqaror interfeys taqdim etadi.
JavaScriptda misol (diagramma):
// Chiqish porti misoli (ma'lumot olish uchun interfeys)
class DataGateway {
getData() {
throw new Error("getData metodini amalga oshirish kerak");
}
}
// API uchun chiqish adaptori misoli
class ApiDataGateway extends DataGateway {
async getData() {
const response = await fetch('/api/data');
return response.json();
}
}
// Biznes mantiqi uchun kirish porti misoli
class BusinessLogicPort {
constructor(dataGateway) {
this.dataGateway = dataGateway;
}
async processData() {
throw new Error("processData metodini amalga oshirish kerak");
}
}
// Core (biznes mantiqi) misoli
class MyBusinessLogic extends BusinessLogicPort {
async processData() {
const data = await this.dataGateway.getData();
// Ma'lumotlarni ishlash mantiqi
console.log("Ishlangan ma'lumotlar:", data);
return data;
}
}
// UI da foydalanish uchun kirish adaptori misoli
async function initApp() {
const apiGateway = new ApiDataGateway(); // Aniq adaptör
const businessLogic = new MyBusinessLogic(apiGateway); // Core portni ishlatadi
await businessLogic.processData(); // Kirish adaptori Core ni chaqiradi
}
initApp();