Daniel Rusnok

Vývojářský blog Daniela Rusnoka

Podle kategorie

Cibulová architektura aneb jak nepřipravovat špagety

Daniel Rusnok       14.01.2020       Architektura       2730 zobrazení

Talíř se špagetami

Jestli se jedná o recept? Jistě. Jestli se jedná o radu jak nepřiravovat špagety? Také. Opravdu patří článek do kategorie Softwarový vývoj? Ano, co Vás nemá? Získal jsem Vaši pozornost? Skvěle, tak čtěte dál.

Tak abych snad vysvětlil, o jakém receptu zde mluvíme. Cibulová architektura je přístup k návrhu vrstev aplikace. Špagety, neboli špagetový kód, je takový kód, který je těžce oddělitelný, propletený a prochází několika vrstvami aplikace. Takový kód je velice těžce upravitelný či rozšířitelný o nové funkce. Cibulová architektura je tedy opravdu jeden z receptů, jak bychom se mohli vyhnout přípravě špaget.

Proč zrovna cibule?

Jak víme, od cibule je vcelku jednoduché oddělovat i napojovat vrstvy. Dobře. Napojování vrstvev cibule na sebe asi nikdo nedělá, ale k představě nám to může posloužit dobře. Architektura cibule se skládá z jádra a vrstev. Co by mělo být v aplikaci jádrem?

Měla by to být Prezentace aplikace? Abychom se chápali. Slovním spojením Prezentace aplikace myslím tu část aplikace, která jí dává vzhled. V softwarovém vývoji se tato část řeší různými technologiemi jako je WPF, Angular či React. A čím se cibule prezentuje? Řekl bych, že slupkou. Z hlediska vzdálenosti se slupka od jádra cibule nachází nejdál. Takže Prezentaci aplikace můžeme zavrhnout.

Měla by to být Databáze? Pojďme se nad tím zamyslet. V databázi nalezneme informace. Jaké informace o cibuli víme? Cibule může nabývat různé barvy, odrůdy, chutě či vzhledu. Pokud mohou informace nabývat různých hodnot, jsou proměnlivé. Pokud je něco proměnlivé, nemůžeme na tom stavět. Nemáme totiž pevně dané jádro. Databázi zavrhujeme také.

Co definuje cibuli jako takovou? Dle mého skromného názoru ji definují geny. Co je to gen? Podle wikipedie je gen jeden ze základních genetických pojmů. Používá se ve dvou základních významech: jako synonymum pro vlohu a jako pojmenování pro konkrétní úsek DNA. Jakožto vloha je gen vlastně jednotka informace, dle níž se vytváří podoba organismu.

Pro naši věc bych si dovolil použít vhodnějšího slova v definici, než je slovo "podoba". Jelikož podoba je dosti spojována se vzhledem, který by mohl čtenáře přivést zpět ke slovnímu spojení Prezentace aplikace. Synonymem slova podoba je slovo "forma".

Co nebo kdo formuje softwarové aplikace? Programátor? Nikoliv. Zjednodušeně řečeno, programátor překládá zadání v lidské řeči do řeči počítače. Takže softwarovou aplikaci formuje zadání? Ano. A co je to zadání? Zadáním je seznam kritérií, která má aplikace splňovat. Pro definici jednoho kritéria zadání nám v softwarovém inženýrství slouží anglický výraz Bussiness rule. Takže výsledek našeho brainstormu je:

Jádro aplikace určují pravidla neboli Bussiness rules, která má aplikace splňovat.


Onion_Architecture

Cibulová architektura

V cibulové architektuře se jádro aplikace dělí na dvě vrstvy. Domain vrstvu a ji obalující vrstvu Application.

Ve vrstvě Domain si budeme udržovat entity a hodnotové objekty naší aplikace. Jako entitu lze chápat každou třídu popisující chování objektu reálného světa, jejíž jedinečnost je určena hodnotou identifikátoru. Například jedinečnost každého Čecha je ve státním systému určena pomocí rodného čísla. Hodnotový objekt musíme chápat jinak. Hodnotový objekt je objekt, jehož jedinečnost je určena jeho hodnotou. Například telefonní číslo či adresa.

Část jádra, nazývající se Application, zastřešuje veškerou práci prováděnou s entitami či hodnotovými objekty. V úvodu jsme zmínili pravidla, neboli Bussiness rules. Jako Bussiness rule si můžeme představit například pravidlo "Ulož zákazníka". Moment. Ale takové pravidlo bude určitě potřebovat pracovat s databází. A v úvodu jsme si jasně řekli, že v jádře se databáze nenachází. Kde je tedy databáze?

Nalezneme ji ve vrstvě Persistence, na obrázku vyznačenou zelenou barvou. Na obrázku je šipkou naznačena závislost vrstvy Persistence na vrstvě Application. Konkrétněji vrstva Application nesmí využívat třídy definované ve vrstvě Persistence.

Jak tedy naimplementovat ukládání zákazníka bez možnosti zavolání třídy z vrstvy Persistence? Vrstvu Persistence si v cibulové architektuře můžete představit jako plugin do vrstvy Application. Co potřebujeme, abychom plugin mohli zapojit? Rozhraní. Kde se bude takové rohraní nacházet? V jádře aplikace. V Application vrstvě si budeme držet rozhraní a jeho konkrétní implementaci naprogramujeme do vrstvy pluginu samotného. Tomuto přístupu se říká Dependency inversion principle. Přístupem získáváme technologickou nezávislost na použité databázi. Databáze se stává implementačním detailem a naše jádro je kompletně separováno od možných vnějších vlivů způsobené databází.

Stejnou motivací jsou vytvořeny zbývající vrsty Presentation a Infrastructure. U vrstvy Presentation název napovídá, že se jedná o již zmiňovanou Prezentaci aplikace. Jelikož se nám technologie pro tvorbu uživatelských rozhraní mění jak na běžícím páse, je dobré i tuto vrstvu od jádra aplikace rozdělit. Obzvláště ve webových technologiích vychází nový Javascriptový framework pomalu každým dnem.

Oddělenost prezentace aplikace nám přináší další výhodu z hlediska množství existence druhů elektronických zařízení. Každý programátor mi dá za pravdu, když řeknu, že prezentační vrstva bude nejlépe na zařízení fungovat, pokud bude napsána v nativní technologii zařízení.

Zbývá nám vrstva Infrastructure. Vrstva Infrastructure slouží ke shlukování implementací komunikací s dalšími externími technologiemi, na kterých nechceme být závislí. Může se například jednat o technologii zodpovědnou za odesílání emailů z Vaší aplikace nebo tisk souborů.

Shrnutí a užitečné odkazy

Cibulová architektura je konkrétní implementační návrh podporující dogmata knihy Clean Architecture, jejíž autorem je Robert C. Martin. Mnou vysvětlená verze cibulové architektury byla navrhnuta softwarovým architektem Jasonem Taylorem. Kompletní repozitář s ukázkovou aplikací je možné nalézt na githubu.

Cibulovou architekturou dosáhneme maximální oddělitelnosti životně důležitých pravidel od vnějších technologií. Pokud nezapředeme do našich Bussiness rules vnější technologie, jsme schopni mnohem lehčím způsobem vnější technologii vyměnit. Architektura umožňuje snadnější použití moderních způsobů vývoje jako je Domain Driven Design a Test Driven Development. Ve společnosti Itixo jsme se architekturou inspirovali a jsme s ní velice spokojeni.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback