Spis treści
Istotą Clean Architecture jest taki dobór architektury i sposobów kodowania systemów, aby zredukować koszty ich wytworzenia, użytkowania, rozwijania i modernizacji w całym cyklu życia. W ten sposób minimalizuje się całkowite koszty posiadania systemu i jednocześnie maksymalizuje produktywność zespołu programistów. Robert C. Martin, twórca koncepcji Clean Architecture, napisał kiedyś, że „każda organizacja projektująca system, tworzy jego architekturę na wzór struktury komunikacyjnej organizacji”[i]. W tym stwierdzeniu jest dużo prawdy – staranność w projektowaniu i kodowaniu ma ścisły związek z kulturą organizacyjną całej firmy. Prawidłowe wybory na etapie projektu i wysoka jakość pracy programistów powodują, że kod jest łatwy do zrozumienia, rozwijania i utrzymania, a samo wdrożenie przebiega szybko i bezproblemowo.
Czym tak właściwie jest Clean Architecture?
U podstaw Clean Architecture legło założenie, że sformułowane wymagania biznesowe powinny w minimalnym stopniu mieć związek z konkretną technologią i szczegółami implementacyjnymi. Zatem wszystkie warstwy tworzące strukturę projektu powinny mieć wyraźnie wydzielone zadania i odpowiedzialność, dając się jednocześnie ławo wyizolować od całości rozwiązania. Idąc dalej, Robert C. Martin zaproponował, żeby tak projektować systemy, aby dało się możliwie dużo kodu współdzielić pomiędzy wieloma środowiskami. W jego oryginalnej propozycji można było wydzielić cztery warstwy:- aplikacji,
- prezentacji
- logiki domenowej/biznesowej
Clean architecture – najważniejsze pojęcia
Czystą architekturę można zwizualizować jako współśrodkowe okręgi odpowiadające poszczególnym warstwom architektury, gdzie w środku znajduje się warstwa najwyższego poziomu. Zatem w centrum mamy logikę domenową i encje, czyli obiekty biznesowe. Warto pamiętać, że logika domenowa lub w nieco węższym pojęciu – biznesowa[iv], dotyczy reguł funkcjonujących w danym obszarze aktywności człowieka. Takie niezmienniki funkcjonują niezależnie od tego, czy powstało jakieś oprogramowanie wykorzystujące tę logikę. Przykładem może być obliczanie np. podatku dochodowego albo proces śledzenia przesyłki do klienta. W tej warstwie swoje odbicie muszą znaleźć także wszystkie istotne procesy biznesowe i przepływy pracy. Do składowych warstwy logiki domenowej, można zaliczyć:- UseCase – składnik, którego zadaniem jest odwzorowanie prawdziwych i realnych wymagań biznesowych oraz dostarczenie warstwie prezentacji dostępu do operacji na danych – np. do pobierania lub modyfikowania wartości poprzez obliczenia. Co ciekawe, UseCase to jedyny sposób wymiany danych pomiędzy warstwą prezentacji a warstwą logiki domenowej.
- Model – to zbiór danych uporządkowanych zgodnie z wybranymi regułami, które są wykorzystywane przez logikę biznesową. Modele w tej warstwie mogą się znacząco różnić od modeli z warstwy danych, łącząc np. kilka modeli w jedną całość, w zależności od potrzeb.
- Logika – to miejsce w strukturze, które służy do przechowywania wydzielonych klas opisujących skomplikowane przypadki logiki domenowej, a które są rzadziej wykorzystywane. Dzięki temu unika się nadmiernie rozbudowanych UseCase.
- DataSource – decydują o miejscu pobierania i zapisywania danych oraz mają dostęp do wszystkich źródeł danych udostępnianych przez warstwę danych. Są one zatem jedynym połączeniem pomiędzy warstwami logiki domenowej i danych. Zadaniem DataSource jest przygotowanie danych do przetwarzania w UseCase.
- Mappery – dbają o spójność i kompletność danych dostarczanych przez warstwę danych tak, aby logika domenowa mogła działać bez zarzutu. Mappery często integrują kilka obiektów z różnych źródeł w warstwie danych w celu utworzenia jednego, ale za to zawierającego wszystkie niezbędne z punktu widzenia logiki domenowej dane.
- Data Transfer Object (DTO), czyli model do dwukierunkowego przesyłania danych. Są one wykorzystywane tylko w tej warstwie, a z ich usług korzystają mappery lub modele biznesowe, w zależności od kierunku przesyłania danych.
- Data – są to miejsca pobierania i zapisywania danych wykorzystywanych w pozostałych modułach systemu. Odpowiednie interfejsy umożliwiają łatwą i szybką wymianę źródeł danych – wystarczy podać odpowiednie obiekty implementujące te interfejsy, aby podmienić dane napływające poprzez Bluetooth na strumień danych z internetu, systemu GPS, czy kamery. Takie zastępowanie źródeł danych najczęściej wykorzystuje się w sytuacji obsługi różnych typów serwerów albo korzystania z danych testowych.