Hexagonal Architecture — sfide dell’adozione dell’architettura esagonale

Ovvero di come stiamo migliorando la scrittura del nostro codice in weBeetle.

Riccardo Tartaglia
weBeetle
5 min readJun 21, 2023

--

Costruire applicazioni disaccoppiate, estendibili, solide e che rispettino tutti i requisiti del cliente è l’obiettivo principale che ci poniamo qui in weBeetle.

Con il tempo il concetto di “buon software” è mutato con la crescita esponenziale di tecnologie e architetture a supporto. Quello che era “buono” 10 anni fa va messo nuovamente in discussione.

Qui in weBeetle abbiamo affrontato un periodo di transizione che ci ha visto affrontare il tema del miglioramento di questo “buono” esplorando nuove strade e nuovi modi di intendere il concetto di software modulare.

Good Job Team

Hexagonal Architecture

La risposta alle nostre esigenze è stata quella di adottare un’architettura esagonale.

L’architettura esagonale è un’architettura software che si basa sul principio di separazione delle responsabilità tra i vari componenti del software. Questa architettura è stata introdotta per la prima volta dallo sviluppatore Alistair Cockburn nel 2005 ed è diventata sempre più popolare negli ultimi anni (Grazie Netflix).

Il principio fondamentale dell’architettura esagonale è quello di separare la logica di business (domain) dal codice che si interfaccia con l’esterno (port) e dal codice che si occupa di trasformare i dati tra i vari componenti (adapter).

In questo modo, il software diventa più modulare, scalabile e facile da manutenere, poiché vengono definite e separate chiaramente le responsabilità di ogni componente.

L’architettura esagonale è stata introdotta in molte aziende con successo, soprattutto in quelle che sviluppano software complessi e che richiedono una manutenzione costante.

Vantaggi

Grazie alla sua struttura modulare, l’architettura esagonale offre molteplici vantaggi.

Ecco i principali:

  • Maggiore manutenibilità del codice: grazie alla struttura modulare dell’architettura esagonale, i vari componenti del software sono separati in modo netto e ogni componente ha una responsabilità ben definita. Ciò rende il codice più facile da comprendere e a modificare, favorendo una manutenzione più efficiente del software;
  • Maggiore flessibilità: l’architettura esagonale permette di sostituire o aggiornare facilmente un componente del software senza dover modificare l’intera applicazione. In questo modo il software può essere facilmente adattato alle esigenze del business, riducendo i tempi e i costi di sviluppo.
  • Maggiore scalabilità: l’architettura esagonale rende più facile scalare il software, in quanto i vari componenti possono essere eseguiti su macchine diverse, senza compromettere l’integrità dell’applicazione. Ciò rende possibile gestire un carico di lavoro elevato e garantire prestazioni ottimali dell’applicazione.
  • Maggiore modularità: grazie alla struttura a componenti dell’architettura esagonale, è possibile sviluppare e testare ogni componente in modo indipendente, senza dover necessariamente integrare l’intera applicazione. Questo significa che gli sviluppatori possono concentrarsi sullo sviluppo dei singoli componenti, favorendo una maggiore efficienza e rapidità nello sviluppo del software.

Come è strutturata l’Hexagonal Architecture

L’architettura esagonale è una forma di architettura del software che si basa sulla struttura esagonale (ma guarda un po’), da cui prende il nome. Questa architettura prevede una suddivisione del software in diversi componenti (o esagoni) interconnessi tra loro, ma con responsabilità ben definite. In particolare, l’architettura esagonale prevede tre tipologie di esagoni: gli adattatori, i driver e i port.

Adattatori

Sono i componenti che si occupano di interfacciare il software con l’esterno, adattando i dati alle esigenze dell’applicazione. Gli adattatori possono essere di due tipi:
primari, che si occupano di interfacciarsi con gli utenti e con le altre applicazioni esterne, e secondari, che si occupano di interfacciarsi con i database o altri sistemi esterni.

Driver

Sono i componenti che si occupano di elaborare i dati all’interno dell’applicazione. Essi possono essere di diversi tipi, in base al tipo di elaborazione che devono effettuare: ad esempio, possono essere driver di business, che si occupano di elaborare i dati in base alle logiche di business dell’applicazione o driver di database, che si occupano di gestire le operazioni di scrittura e lettura dei dati dal database.

Port

Sono i componenti che rappresentano i punti di ingresso e di uscita dell’applicazione. Essi definiscono l’interfaccia di comunicazione tra gli adattatori e i driver, garantendo una chiara separazione tra le due parti e una maggiore modularità del software. Ad esempio possiamo considerare una port l’interfaccia REST che un server può esporre per rendere fruibile la business code.

La nostra esperienza

Una delle nostre ultime sfide tecniche è stata la realizzazione di uno nuovo web service cercando di applicare tutti i principi descritti finora.

L’ostacolo più grande affrontato è stato il capire come suddividere in maniera efficiente i vari layer di logica applicativa, perché ogni pezzettino di logica va sistemato all’interno dell’architettura in maniera precisa, in modo che possa essere riutilizzato in qualsiasi momento.

Non è stato facile da digerire, ci sono state più review dai vari membri del team e molte di queste sono stati terreno di confronto con l’obiettivo di modificare e far calzare meglio la struttura esagonale alle nostre necessità.

E come comporre un puzzle.

Capisci di essere arrivato a buon punto quando i pezzi mancanti vanno al loro posto quasi in maniera naturale.

Il risultato finale è appagante: un miglioramento significativo nella qualità del software.

I vari componenti sono stati sviluppati e testati in modo indipendente, garantendo una maggiore affidabilità e prestazioni ottimali dell’applicazione, tutti gli sviluppatori hanno potuto lavorare in modo più efficiente risolvendo rapidamente eventuali problemi o bug nel software.

La base codice è flessibile, modificarla per adattarsi al business non significa più riscrivere intere parti da zero.

Questo ci ha portato a definire una strategia di testing ottimale per i vari componenti, altro grande passo avanti (ma questa è un’altra storia).

Per concludere, il nostro lavoro richiede una grande flessibilità nell’adattarsi in modo efficiente ai cambiamenti del mercato, spostare il focus sull’esigenze del cliente e saper generare valore in maniera efficiente.

Grazie alla sua struttura modulare e flessibile, l’architettura esagonale rappresenta un’ottima scelta per le aziende che cercano di creare software rivoluzionando la propria visione di “buono”.

Si ma il codice?

Ecco un piccolo repository che può diventare il prossimo punto di partenza per un servizio Node JS

Aggiungo anche il repository all’altro template realizzato in PHP con framework Symfony

--

--

Riccardo Tartaglia
weBeetle

Fullstack Web Developer 🦄 Aiuto i professionisti e le aziende a comprendere i meccanismi della digitalizzazione.