Porty i adaptery

Porty i adaptery

Ostatnio pisałem o pracy z zastanym kodem. Za to dziś pora na coś z drugiego bieguna. Tym czymś jest wybór architektury. Dla wielu projektów architektura jest jedną z pierwszych decyzji do podjęcia. W niektórych przypadkach odpowiada za nią architekt, w innych  duży wpływ na nią mają programiści. Dlatego jedną z architektur które można rozważyć to porty i adaptery.

Porty i adaptery – nazwy

Porty i adaptery (ports and adapters) posiadają inną nazwą – hexagonal architecture. Również bardzo zbliżone założenia mają onion architecture oraz clean architecture. W każdym z tych podejść ważny jest core, który dobrze współgra z DDD.

porty i adaptery przykład
porty i adaptery

Core

Znajduje się w samym centrum hexagonu. Ponieważ zawiera obiekty domenowe oraz logikę biznesową. Ponadto nie ma tutaj żadnych frameworków. Po prostu czysty kod w danym języku i nic więcej.

Porty

Służą do wywołania logiki domenowej. Znajdują się one na krawędziach hexagonu i należą do core’u aplikacji. Istnieją ich dwa rodzaje.

Primary/Driver ports

W większości przypadków będą to serwisy, które zawierają logikę biznesową. Przykładem jest UI port na powyższym rysunku.

Secondary/Driven ports

Zazwyczaj są to interfejsy, które służą do komunikacji ze światem zewnętrznym. W moim przykładzie to jest DB port.

Adaptery

Głównym zadaniem adapterów jest przetworzenie żądań, które zawierają technologię na język domenowy oraz operacje odwrotne. Także dla nich istnieją dwie grupy.

Primary/Driver adapters

Służą do zamiany requestów związanych z frameworkiem na żądania które są zrozumiałe przez core aplikacji. Te adaptery wywołują primary ports, czego przykładem jest UI adapter.

Secondary/Driven adapters

Zazwyczaj są implementacją interfejsów z secondary ports. To właśnie tutaj pojawiają się interakcje z bazą, komunikacja z zewnętrznymi usługami. Dlatego można je nazwać infrastrukturą.

Architektura hexagonalna plusy i minusy

Jak każde podejście porty i adaptery mają swoje dobre i złe strony o których warto wiedzieć podczas wyboru.

Wady

  • może istnieć wiele klas pośrednich. Powodem tego jest tłumaczenie obiektów domenowych na niedomenowe.
  • skomplikowanie. Dla osób które nie pracowały z tym rodzajem architektury próg wejścia może być wyższy. Ale dzięki programowaniu w parze z doświadczona osobą można ten problem rozwiązać.

Zalety

  • core bez zewnętrznych zależności. Dzięki temu bardzo łatwo można rozpocząć prace aplikacją. Co może skutkować szybko dostępnym prototypem.
  • łatwa do testów. Skoro core aplikacji nie posiada zewnętrznych zależności to przetestowanie logiki domenowej jest proste. Ponadto stworzenie portu, który ma storage w pamięci jest również proste.
  • opóźniony wybór technologii. Początkowo podczas startu projektu nie trzeba decydować jaką bazę, frameworku użyć. Z tego powodu decyzję można odłożyć do czasu gdy już posiadamy wiedzę co jest potrzebne.

Czy stosować porty i adaptery

Na to pytanie można odpowiedzieć tylko w jeden sposób:

To zależy.

Na pewno przy CRUDach, niewielkich aplikacjach raczej nie proponowałbym tej architektury. Jednak w przypadku aplikacji, które zawierają logikę domenową, mają zmienne wymagania czy istnieje prawdopodobieństwo  zmiany technologii to wtedy architektura hexagonalna jest warta rozważenia.

Ponadto jeśli ktoś jest zainteresowany to w poniższych książkach są rozdziały odnośnie architektury hexagonalnej oraz czystej architektury.
DDD dla architektów oprogramowania
Czysta architektura. Struktura i design oprogramowania. Przewodnik dla profesjonalistów