Adapters Architecture (aka Hexagonal Architecture) Introduzione L’architettura Ports & Adapters fu introdotta per la prima volta da Alistair Cockburn nel 2005.
“Allow an application to equally be driven
by users, programs, automated test or batch scripts, and to be developed and tested in isolation from its eventual run-time devices and databases.” Problema Uno dei problemi frequenti dello sviluppo software degli ultimi anni, è legato alla penetrazione di logiche di business nel codice di user interface.
L’obiettivo dell’architettura proposta è quello di separare in
maniera netta la logica di business dell’applicazione dall’interfaccia grafica, database o qualsiasi altro componente esterno. Idea alla base della soluzione L’idea di base dell’architettura Ports and Adapters è che l’applicazione è la parte centrale del nostro sistema. Tutti gli input e gli output comunicano con il core dell’applicazione tramite delle interfacce chiamate porte, che isolano l’applicazione da tecnologie e strumenti esterni al nostro dominio.
Il core dell’applicazione non deve essere a conoscenza di chi invia
e riceve gli input e output nel nostro sistema. Concetti chiave ● Core ○ Domain Object ○ Use Case ● Ports ○ Primary/Input Ports ○ Secondary/Output Ports ● Adapters ○ Primary/Driving Adapters ○ Secondary/Driven Adapters Core Il core dell’applicazione è il luogo del nostro sistema dove risiede tutta la logica di business.
È formato da due componenti principali: i domain
objects e gli use cases. I domain objects sono la parte centrale dell’applicazione e tramite questi oggetti andiamo a modellare il nostro dominio applicativo.
I domain objects non hanno alcuna dipendenza verso
altri componenti del nostro sistema: se un requisito di business cambia è sufficiente modificare l’oggetto per riflettere i nuovi requisiti. Domain Object - Esempio Core - Use Cases Gli use cases sono un astrazione per rappresentare cosa un utente può fare nell’applicazione.
Anche gli use cases fanno parte del core
dell’applicazione e non hanno dipendenze verso componenti esterni. Porte Il core dell’applicazione utilizza delle interfacce dedicate, chiamate porte, per comunicare verso l’esterno.
Le porte si dividono in primary ports (input ports) e
secondary ports (output ports). Le porte primarie espongono le funzionalità del core al mondo esterno e vengono posizionate a sinistra dell’esagono.
Le porte secondarie vengono invece usate dal core
per poter comunicare con servizi esterni (es. Per comunicare con un database). Porte - Esempio Primary port - operazioni sull’account utente
Secondary port - memorizzazione su database
Adapters Gli adapters sono, essenzialmente, un'implementazione delle porte.
Anche gli adapters si dividono in primary adapters e
secondary adapters e sono l’implementazione delle porte di input e output rispettivamente.
Interagiscono con il core dell’applicazione ma sono
componenti indipendenti. Vantaggi dell’Architettura ● Netta separazione tra logica di business e componenti esterni. ● La logica di business non dipende da interfaccia utente, database o altre tecnologie. ● Miglior testabilità del sistema: ogni componente può essere testato in autonomia e di conseguenza si riduce il bisogno di numerosi end-to-end testing.