Sobes.tech
Senior

Պատմեք հեքսագոնալ ճարտարապետության մասին և դրա ծագման մասին։

sobes.tech AI

Պատասխան AI-ից

Հեքսագոնալ ճարտարապետությունը (Ports and Adapters)՝ դա Ալիսթեր Կոբեռնի առաջարկած ճարտարապետական նմուշ է։ Նրա նպատակն է առանձնացնել բիզնես տրամաբանության միջուկը արտաքին կախվածություններից (UI, տվյալների բազաներ, երրորդ կողմի ծառայություններ)։

Ծագում:

Ալիսթեր Կոբեռն այս կոնցեպցիան ներկայացրել է 2005 թվականին։ Հիմնական գաղափարը առաջացել է ավանդական բազմաշերտ ճարտարապետությունների արձագանքից, որտեղ բիզնես տրամաբանությունը հաճախ շատ կապված էր ենթակառուցվածքային շերտի հետ։ Կոբեռն ուզում էր ստեղծել ճարտարապետություն, որը թույլ կտա զարգացնել և փորձարկել բիզնես տրամաբանությունը անկախ նրանից, թե ինչպես այն փոխազդում է արտաքին աշխարհի հետ։ "Հեքսագոնալ" անվանումը խորհրդանշում է այն հնարավորությունը, որ կիրառությունը կարող է փոխազդել տարբեր արտաքին "ապարատների" հետ՝ "պորտեր" միջոցով։ Հեքսագոնալը ընտրվել է որպես աբստրակտ ձև, որը ունի բավականաչափ "անկյուններ" (պորտեր) տարբեր համակարգերի հետ փոխազդելու համար։

Հիմնական սկզբունքները:

  • Ներքին (Core / Domain): պարունակում է մաքուր բիզնես տրամաբանություն և դոմենային օբյեկտներ։ Դա կախված չէ արտաքին տեխնոլոգիաներից։
  • Պորտեր (Ports): ինտերֆեյսներ, որոնք սահմանում են փոխազդեցությունը ներքին և արտաքին աշխարհի միջև։ Կան երկու տեսակի պորտեր՝
    • Մուտքային (Driving Ports): սահմանում են, թե ինչպես արտաքին գործակալները (օրինակ, օգտվողի ինտերֆեյսը կամ API-ն) կարող են կանչել ներքին ֆունկցիաները։
    • Ելքային (Driven Ports): սահմանում են, թե ինչպես ներքինը կարող է փոխազդել արտաքին ծառայությունների հետ (օրինակ, տվյալների բազա կամ երրորդ API)։ Ներքինը սահմանում է այդ ինտերֆեյսները, բայց չի իրականացնում դրանք։
  • Ադապտերներ (Adapters): իրականացնում են պորտերը և ծառայում որպես կապող օղակ ներքին և արտաքին տարրերի միջև։ Կան նաև երկու տեսակի ադապտերներ՝
    • Մուտքային (Driving Adapters): փոխակերպում են արտաքին գործակալների հարցումները այն ֆորմատին, որը հասկանում է ներքինը (օրինակ, UI ադապտեր)
    • Ելքային (Driven Adapters): փոխակերպում են ներքինի կանչերը այն ֆորմատին, որը հասկանում են արտաքին ծառայությունները (օրինակ, տվյալների բազայի ադապտեր)

Առավելություններ:

  • Անջատում: Ներքին բիզնես տրամաբանության միջուկը կախված չէ արտաքին տեխնոլոգիաներից։
  • Թեստավորում: Ներքինը կարող է անկախ փորձարկվել, առանց ամբողջ ստեկի գործարկման։
  • Ենթակաություն: Լավ է փոխարինել մեկ ադապտերին մյուսով՝ առանց փոփոխության բազային։
  • Պահպանելիություն: Տարբեր մասեր ծրագրի (ներքին և ադապտերներ) կարող են զարգանալ և զարգանալ անկախ։

Հայտում Frontend-ում:

Չնայած հեքսագոնալ ճարտարապետությունը հաճախ կապված է բեքենդի հետ, նրա սկզբունքները կարող են կիրառվել նաև ֆրոնտենդում՝ հաճախորդային ծրագրի կառուցվածքը կազմակերպելու համար:

  • Ներքին: Մոդուլներ, որոնք պարունակում են բիզնես տրամաբանություն և ծրագրի վիճակ (օրինակ, Redux reducer-ներ, 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 մուտք գործելու իրականացման)