Parlami dell'architettura esagonale e delle sue origini.
sobes.tech AI
Risposta dell'AI
L'architettura esagonale (Ports e Adattatori) è un modello architetturale proposto da Alistair Cockburn. È progettata per isolare il nucleo della logica di business dell'applicazione dalle dipendenze esterne (UI, database, servizi di terze parti).
Origine:
Alistair Cockburn ha presentato il concetto nel 2005. L'idea principale è nata come reazione alle architetture tradizionali a più livelli, dove la logica di business era spesso fortemente legata allo strato infrastrutturale. Cockburn voleva creare un'architettura che permettesse di sviluppare e testare la logica di business indipendentemente da come interagisse con il mondo esterno. Il nome "esagonale" simboleggia la capacità dell'applicazione di interagire con diversi tipi di "adattatori" esterni attraverso "porte". È stato scelto un esagono come figura astratta con abbastanza "facce" (porte) per interagire con diversi sistemi.
Principi fondamentali:
- Nucleo (Core / Dominio): Contiene la logica di business pura e gli oggetti di dominio. Non dipende dalle tecnologie esterne.
- Porte (Ports): Interfacce che definiscono l'interazione tra il nucleo e il mondo esterno. Esistono due tipi di porte:
- Entranti (Driving Ports): Definiscono come gli agenti esterni (ad esempio, interfaccia utente o API) possono chiamare le funzioni del nucleo.
- Uscenti (Driven Ports): Definiscono come il nucleo può interagire con servizi esterni (ad esempio, database o API di terze parti). Il nucleo definisce queste interfacce, ma non le implementa.
- Adattatori (Adapters): Implementano le porte e fungono da collegamento tra il nucleo e gli elementi esterni. Esistono anche due tipi di adattatori:
- Entranti (Driving Adapters): Trasformano le richieste dagli agenti esterni in un formato comprensibile dal nucleo (ad esempio, adattatore UI).
- Uscenti (Driven Adapters): Trasformano le chiamate dal nucleo in un formato comprensibile dai servizi esterni (ad esempio, adattatore di database).
Vantaggi:
- Isolamento: Il nucleo della logica di business non dipende dalle tecnologie esterne.
- Testabilità: Il nucleo può essere testato indipendentemente, senza dover avviare l'intera pila.
- Flessibilità: È facile sostituire un adattatore con un altro senza modificare il nucleo (ad esempio, passare da un database all'altro).
- Manutenibilità: Le diverse parti dell'applicazione (nucleo e adattatori) possono essere sviluppate e evolversi indipendentemente.
Applicazione nel Frontend:
Sebbene l'architettura esagonale sia più associata al backend, i suoi principi possono essere applicati anche nel frontend per strutturare l'applicazione cliente:
- Nucleo: Moduli che contengono la logica di business e lo stato dell'applicazione (ad esempio, riduttori di Redux, store Zustand, componenti con logica pura senza legame con il DOM).
- Porte: Interfacce che definiscono come l'UI interagisce con la logica (entranti) e come la logica interagisce con API esterne o archiviazione locale (uscenti).
- Adattatori: Componenti UI che gestiscono l'input dell'utente e chiamano le porte (adattatori entranti), e servizi che eseguono richieste HTTP o lavorano con l'API del browser come localStorage (adattatori uscenti).
Esempio di struttura (astratta):
📦 app
┣ 📂 core
┃ ┣ 📂 domain
┃ ┃ ┗ 📜 todos.ts // Descrizione dell'entità Todo
┃ ┣ 📂 application
┃ ┃ ┗ 📜 todoService.ts // Logica di business per Todo
┃ ┗ 📂 ports
┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Porta in (interfaccia per UI)
┃ ┃ ┗ 📜 out/ITodoRepository.ts // Porta out (interfaccia per accesso ai dati)
┣ 📂 infra
┃ ┣ 📂 adapters
┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Adattatore in (componente React)
┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Adattatore out (implementazione accesso API)