Senior
რა იცით პორტებისა და ადაპტერების არქიტექტურაზე?
sobes.tech AI
პასუხი AI-სგან
პორტებისა და ადაპტერების არქიტექტურა, ასევე ცნობილი როგორც ჰექსაგონალური არქიტექტურა (Hexagonal Architecture), გამოყოფს აპლიკაციის საგნობრივი ლოგიკას (Core) გარე დამოკიდებულებებიდან (მომხმარებლის ინტერფეისები, მონაცემთა ბაზები, გარე სერვისები).
ძირითადი კონცეფციები:
- პორტები: განსაზღვრავენ ინტერფეისებს, რომელთა მეშვეობითაც Core ურთიერთქმედებს გარე სამყაროსთან. პორტები იყოფა ორ ტიპად:
- შესასვლელი (Driving Ports): გამოიყენება გარე სუბიექტების მიერ Core-ის ფუნქციონალის გამოძახებისთვის (მაგალითად, API-ინტერფეისი).
- გამოსავალი (Driven Ports): გამოიყენება Core-ის მიერ გარე სუბიექტების ფუნქციონალის გამოძახებისთვის (მაგალითად, მონაცემთა ბაზის ინტერფეისი).
- ადაპტერები: რეალიზებენ პორტებს, აკავშირებენ Core-ს კონკრეტულ გარე ტექნოლოგიებთან ან ფრეიმვორკებთან:
- შესასვლელი (Driving Adapters): რეალიზებენ შესასვლელ პორტებს და გარდაქმნიან გარე გარემოდან შემოსულ მოთხოვნებს Core-ის გამოძახილებად, მაგალითად, REST-კონტროლერი.
- გამოსავალი (Driven Adapters): რეალიზებენ გამოსავალ პორტებს და გარდაქმნიან Core-დან გამავალი გამოძახილებს გარე გარემოსთან ურთიერთქმედებისთვის, მაგალითად, კონკრეტული მონაცემთა ბაზის რეპოზიტორის რეალიზაცია.
- Core (საგნობრივი სფერო): შეიცავს აპლიკაციის ბიზნეს-ლოგიკას. იგი სრულად იზოლირებულია გარე დეტალებისგან და ურთიერთქმედებს მათთან მხოლოდ პორტების მეშვეობით.
უპირატესობები:
- ტესტირების შესაძლებლობა: Core-ის იზოლაცია ამარტივებს ბიზნეს-ლოგიკის ერთეულური ტესტირებას, საჭირო არ არის რთული გარე დამოკიდებულებების მოკირება.
- სწრაფობა: ადვილად შესაძლებელია ახალი გარე ტექნოლოგიების (მონაცემთა ბაზები, ფრეიმვორკები) შეცვლა ან დამატება, دون Core-ის შეცვლის, საკმარისია ახალი ადაპტერის დაწერა არსებული პორტისთვის.
- სუფთა კოდი: ხელს უწყობს უფრო სუფთა და შენარჩუნებად კოდის შექმნას, ყურადღება მხოლოდ ბიზნეს-წესრიგებზე.
- პასუხისმგებლობის განყოფილება: მკაფიოდ ყოფს პასუხისმგებლობის ზონებს.
ფრონტენდთან კავშირი:
ფრონტენდში პორტებისა და ადაპტერების არქიტექტურა გამოიყენება:
- ბიზნეს-ლოგიკის და მონაცემთა წყაროს განყოფილება: კომპონენტი ურთიერთქმედებს "პორტთან" (ინტერფეისთან), რომელიც შეიძლება განხორციელდეს სხვადასხვა "ადაპტერებით" (API-ებით, ლოკალური შენახვით, ტესტური მოკებით და ა.შ).
- გარე მოვლენის დამუშავება: შესასვლელი პორტები შეიძლება წარმოადგენდეს UI-ის მოვლენის დამუშავებლებს, ხოლო ადაპტერები გარდაქმნიან ამ მოვლენებს შიდა ლოგიკის გამოძახილებად.
- გარე ბიბლიოთეკების ურთიერთქმედების ინკაფსულაცია: ადაპტერები შეიძლება ჩაახშოს გარე ბიბლიოთეკების მიმართვები, მაგალითად, რუკების სამუშაო ბიბლიოთეკა, და უზრუნველყოს Core-ის მარტივი და სტაბილური ინტერფეისი.
JavaScript-ის მაგალითი (შეგნობა):
// გამოსავალი პორტის მაგალითი (მონაცემების მიღების ინტერფეისი)
class DataGateway {
getData() {
throw new Error("getData მეთოდი უნდა განხორციელდეს");
}
}
// გამოსავალი ადაპტერის მაგალითი (API-ისთვის)
class ApiDataGateway extends DataGateway {
async getData() {
const response = await fetch('/api/data');
return response.json();
}
}
// შესასვლელი პორტის მაგალითი (ბიზნეს-ლოგიკისთვის)
class BusinessLogicPort {
constructor(dataGateway) {
this.dataGateway = dataGateway;
}
async processData() {
throw new Error("processData მეთოდი უნდა განხორციელდეს");
}
}
// Core-ის მაგალითი (ბიზნეს-ლოგიკა)
class MyBusinessLogic extends BusinessLogicPort {
async processData() {
const data = await this.dataGateway.getData();
// მონაცემების დამუშავების ლოგიკა
console.log("მონაცემები დამუშავებულია:", data);
return data;
}
}
// შესასვლელი ადაპტერის მაგალითი (UI-ში გამოყენება)
async function initApp() {
const apiGateway = new ApiDataGateway(); // კონკრეტული ადაპტერის მაგალითი
const businessLogic = new MyBusinessLogic(apiGateway); // Core იყენებს პორტს
await businessLogic.processData(); // შესასვლელი ადაპტერის გამოძახება Core-დან
}
initApp();