Αναφέρετε την εξαγωνική αρχιτεκτονική και την προέλευσή της.
sobes.tech AI
Απάντηση από AI
Η εξαγωνική αρχιτεκτονική (Ports and Adapters) είναι ένα πρότυπο αρχιτεκτονικής που προτάθηκε από τον Alistair Coburn. Σκοπός της είναι να απομονώσει τον πυρήνα της επιχειρηματικής λογικής της εφαρμογής από εξωτερικές εξαρτήσεις (UI, βάσεις δεδομένων, τρίτες υπηρεσίες).
Προέλευση:
Ο Alistair Coburn παρουσίασε την έννοια το 2005. Η βασική ιδέα προέκυψε ως αντίδραση στις παραδοσιακές πολυεπίπεδες αρχιτεκτονικές, όπου η επιχειρηματική λογική συχνά ήταν στενά συνδεδεμένη με το υποστηρικτικό επίπεδο. Ο Coburn επιδίωξε να δημιουργήσει μια αρχιτεκτονική που θα επιτρέπει την ανάπτυξη και δοκιμή της επιχειρηματικής λογικής ανεξάρτητα από το πώς αλληλεπιδρά με τον εξωτερικό κόσμο. Το όνομα "εξαγωνική" συμβολίζει την δυνατότητα της εφαρμογής να αλληλεπιδρά με διάφορους τύπους εξωτερικών "ανταπτορ" μέσω "πύλων". Η εξαγωνική επιλέχθηκε ως μια αφηρημένη μορφή που διαθέτει αρκετά "γωνίες" (πύλες) για αλληλεπίδραση με διαφορετικά συστήματα.
Βασικές αρχές:
- Πυρήνας (Core / Domain): Περιέχει καθαρή επιχειρηματική λογική και αντικείμενα τομέα. Δεν εξαρτάται από εξωτερικές τεχνολογίες.
- Πύλες (Ports): Ορίζουν τις διεπαφές που καθορίζουν την αλληλεπίδραση μεταξύ πυρήνα και εξωτερικού κόσμου. Υπάρχουν δύο τύποι πύλων:
- Εισερχόμενοι (Driving Ports): Ορίζουν πώς οι εξωτερικοί παράγοντες (π.χ., διεπαφή χρήστη ή API) μπορούν να καλούν λειτουργίες του πυρήνα.
- Εξερχόμενοι (Driven Ports): Ορίζουν πώς ο πυρήνας μπορεί να αλληλεπιδρά με εξωτερικές υπηρεσίες (π.χ., βάσεις δεδομένων ή τρίτα API). Ο πυρήνας ορίζει αυτές τις διεπαφές, αλλά δεν τις υλοποιεί.
- Ανταπτορ (Adapters): Υλοποιούν τους πύλες και λειτουργούν ως σύνδεσμος μεταξύ πυρήνα και εξωτερικών στοιχείων. Υπάρχουν επίσης δύο τύποι ανταπτορ:
- Εισερχόμενοι (Driving Adapters): Μετατρέπουν τα αιτήματα από εξωτερικούς παράγοντες σε μορφή κατανοητή από τον πυρήνα (π.χ., UI ανταπτορ).
- Εξερχόμενοι (Driven Adapters): Μετατρέπουν τις κλήσεις από τον πυρήνα σε μορφή κατανοητή από τις εξωτερικές υπηρεσίες (π.χ., βάσης δεδομένων ανταπτορ).
Πλεονεκτήματα:
- Απομόνωση: Ο πυρήνας επιχειρηματικής λογικής δεν εξαρτάται από εξωτερικές τεχνολογίες.
- Δοκιμαστικότητα: Ο πυρήνας μπορεί να δοκιμαστεί ανεξάρτητα, χωρίς την ανάγκη εκτέλεσης ολόκληρου του στοίβας.
- Ευελιξία: Είναι εύκολο να αντικαταστήσετε έναν ανταπτορ με άλλον χωρίς να αλλάξει ο πυρήνας (π.χ., μετάβαση από μια βάση δεδομένων σε άλλη).
- Υποστήριξη: Οι διαφορετικές части της εφαρμογής (πυρήνας και ανταπτορ) μπορούν να αναπτυχθούν και να εξελιχθούν ανεξάρτητα.
Εφαρμογή στο Frontend:
Αν και η εξαγωνική αρχιτεκτονική συχνά συσχετίζεται με το backend, οι αρχές της μπορούν να εφαρμοστούν και στο frontend για την δομή του πελάτη:
- Πυρήνας: Μονάδες που περιέχουν επιχειρηματική λογική και κατάσταση της εφαρμογής (π.χ., Redux reducers, Zustand store, components με καθαρή λογική χωρίς σύνδεση με το DOM).
- Πύλες: Διεπαφές που καθορίζουν πώς το UI αλληλεπιδρά με τη λογική (εισερχόμενες) και πώς η λογική αλληλεπιδρά με εξωτερικά API ή τοπική αποθήκευση (εξερχόμενες).
- Ανταπτορ: Components UI που χειρίζονται την εισαγωγή χρήστη και καλούν πύλες (εισερχόμενοι ανταπτορ), και υπηρεσίες που εκτελούν HTTP αιτήματα ή εργάζονται με το browser 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 component)
┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Εξερχόμενος ανταπτορ (υλοποίηση πρόσβασης σε API)