Sobes.tech
Senior

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)