Sobes.tech
Senior

გესაგონული არქიტექტურისა და მის წარმოშობის შესახებ ისაუბრეთ.

sobes.tech AI

პასუხი AI-სგან

ჰექსაგონალური არქიტექტურა (Ports and Adapters) არის არქიტექტურული ნიმუში, რომელიც შემოგთავაზა ალისტერ კობერნმა. მისი მიზანია ბიზნეს-ლოგიკის კერა იზოლირებული იყოს გარე დამოკიდებულებებისგან (UI, ბაზები მონაცემები, მესამე მხარის სერვისები).

მომდინარეობა:

ალისტერ კობერნმა წარმოადგინა კონცეფცია 2005 წელს. ძირითადი იდეა წარმოიშვა ტრადიციული მრავალსაფეხურიანი არქიტექტურების რეაქციად, სადაც ბიზნეს-ლოგიკა ხშირად იყო მჭიდროდ დაკავშირებული ინფრასტრუქტურის ფენასთან. კობერნი ცდილობდა შექმნას არქიტექტურა, რომელიც საშუალებას მისცემს განავითაროს და ტესტოს ბიზნეს-ლოგიკა დამოუკიდებლად იმით, თუ როგორ ურთიერთქმედებს იგი გარე სამყაროსთან. სახელწოდება "ჰექსაგონალური" სიმბოლიზირებს აპლიკაციის შესაძლებლობას ურთიერთქმედოს სხვადასხვა ტიპის გარე "ადაპტერებთან" through "პორტების". ჰექსაგონი აირჩიეს როგორც აბსტრაქტული ფიგურა, რომელსაც აქვს საკმარისი "კუთხეები" (პორტები) ურთიერთქმედებისთვის სხვადასხვა სისტემებთან.

ძირითადი პრინციპები:

  • კერა (Core / Domain): შეიცავს სუფთა ბიზნეს-ლოგიკას და დომენის ობიექტებს. იგი არ არის დამოკიდებული გარე ტექნოლოგიებზე.
  • პორტები (Ports): ინტერფეისები, რომლებიც განსაზღვრავენ ურთიერთქმედებას კერისა და გარე სამყაროს შორის. არსებობს ორი ტიპის პორტი:
    • შესავალი (Driving Ports): განსაზღვრავს, როგორ შეუძლია გარე აგენტებს (მაგ., მომხმარებლის ინტერფეისი ან API) გამოიძახონ კერის ფუნქციები.
    • გამავალი (Driven Ports): განსაზღვრავს, როგორ შეუძლია კერს ურთიერთქმედოს გარე სერვისებთან (მაგ., ბაზა მონაცემები ან მესამე მხარის API). კერი განსაზღვრავს ამ ინტერფეისებს, მაგრამ არ ახორციელებს მათ.
  • ადაპტერები (Adapters): ახორციელებენ პორტებს და სერვისებს შორის კავშირის ხიდს. არსებობს ასევე ორი ტიპის ადაპტერები:
    • შესავალი (Driving Adapters): გარდაქმნიან გარე აგენტების მოთხოვნებს იმ ფორმატში, რომელიც კერს ესმის (მაგ., UI ადაპტერ).
    • გამავალი (Driven Adapters): გარდაქმნიან კერის გამოძახილებს გარე სერვისების ფორმატში (მაგ., ბაზა მონაცემების ადაპტერ).

უპირატესობები:

  • იზოლაცია: ბიზნეს-ლოგიკის კერი არ არის დამოკიდებული გარე ტექნოლოგიებზე.
  • ტესტირების შესაძლებლობა: კერი შეიძლება ტესტირდეს დამოუკიდებლად, მთელი სტეკის გაშვების გარეშე.
  • სწრაფი ცვლილებები: ადაპტერის შეცვლა შესაძლებელია კერის ცვლილების გარეშე (მაგ., ერთი ბაზის მონაცემიდან მეორე-ზე გადასვლა).
  • მოდულურობა: სხვადასხვა ნაწილი (კერი და ადაპტერები) შეიძლება განვავითაროთ და ევოლუციონირდეს დამოუკიდებლად.

გამოყენება ფრონტენდში:

მიუხედავად იმისა, რომ ჰექსაგონალური არქიტექტურა ხშირად დაკავშირებულია ბექენდთან, მისი პრინციპები შეიძლება გამოყენებულ იქნას ფრონტენდშიც, რათა სტრუქტურირებული იყოს კლიენტური აპლიკაცია:

  • კერი: მოდულები, რომლებიც შეიცავს ბიზნეს-ლოგიკას და აპლიკაციის მდგომარეობას (მაგ., Redux-რედუქტორები, Zustand სთორები, კომპონენტები სუფთა ლოგიკით, რომელიც არ არის დაკავშირებული DOM-თან).
  • პორტები: ინტერფეისები, რომლებიც განსაზღვრავენ, როგორ ურთიერთქმედებს UI ლოგიკასთან (შესავალი), და როგორ ურთიერთქმედებს ლოგიკა გარე API-ებთან ან ადგილობრივ შენახვასთან (გამავალი).
  • ადაპტერები: UI კომპონენტები, რომლებიც მართავენ მომხმარებლის ინპუტს და გამოიძახიან პორტებს (შესავალი ადაპტერები), და სერვისები, რომლებიც ახორციელებენ HTTP-კითხვებს ან მუშაობენ ბრაუზერის API localStorage-სთან (გამავალი ადაპტერები).

საბაზისო სტრუქტურა (აბსტრაქტული):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Todo ობიექტის აღწერა
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // ბიზნეს-ლოგიკა Todo-სთან მუშაობისთვის
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // შესავალი პორტი (UI-ისთვის ინტერფეისი)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // გამავალი პორტი (მონაცემთა წვდომის ინტერფეისი)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // შესავალი ადაპტერ (React კომპონენტი)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // გამავალი ადაპტერ (API-ის რეალიზაცია)