Պատմեք հեքսագոնալ ճարտարապետության մասին և դրա ծագման մասին։
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 մուտք գործելու իրականացման)