Architektura aplikace

Architekturu aplikace můžeme rozdělit do dvou částí Core a Infrastructre. Core obsahuje byznys logiku a infrastructure obsahuje části aplikace které nejsou důležité pro byznys. Ve většině případů infrastruktura obaluje volání externích služeb (např. databáze, service bus) nebo knihoven.

Infrastruktura je důležitou součástí aplikace jelikož upravuje volání externích služeb a knihoveny tak aby odpovídali přesně tomu co potřebuje byznys logika aplikace. Například odeslání e-mailu může vypadat následovně.

        var message = new MimeMessage();
	message.To.Add(to);
	message.From.Add(from);
	message.Subject = subject;
	message.Body = new TextPart(TextFormat.Html)
	{
		Text = body;
	};

	using (var emailClient = new SmtpClient())
	{
		emailClient.Connect(_emailConfiguration.SmtpServer, _emailConfiguration.SmtpPort, true);
		emailClient.Send(message);
		emailClient.Disconnect(true);
	}

Celý tento kód není pro byznys logiku aplikace důležitý a proto je vhodné ho vložit do infrastuktury a z Coru volat metodu – SendEmail(string from, string to, string subject, string body).

Obrácení závislostí

Pattern popsaný v přechozí části se nazývá Secondary nebo Driven Adapter a je obvykle popisován jako součást hexagonální architektury. Hexagonální architektura ale posouvá tento pattern ještě o krok dál. Namísto toho aby Core přímo volal infrastrukturu provádí se obrácení závislostí. Následující obrázky demonstrují tento rozdíl:

Běžná architektura
Hexagonální architektura

Obecně se uvádí že obrácení závislostí má tři výhody:

  • Lepší testovatelnost – testování Core je jendodušší jelikož můžeme jednodušše namockovat implementaci interfacu který skrývá infrastrukturu.
  • Jenodušší změny infrastruktury – můžeme změnit infrastrukturu bez změny jejího interfacu. Nění tedy potřeba nijak upravovat core.
  • Menší šance udělat chybu – pokud nepoužijeme interface může se stát že část byznys logiky programátor nechtěně vloží do infrastruktury nebo naopak část infrastruktury vloží do Core.

V praxy se ale ukazuje že tyto výhody nejsou pravdivé nebo nejsou příliš použitelné.

Lepší testovatelnost – ačkoliv interface zvýší testovatelnost Coru existují i jiné (lepší) techniky testování. O těchto technikách si povíme v dalším článku.

Jednodušší změny infrastruktury – při změně infrastruktury můžeme jednodušše upravit třídu která je aktuálně používána a nemusíme nutně měnit její implementaci za novou třídu.

Menší šance udělat chybu – toto tvrzení je zmíněno jako jedna z hlavních motivací proč použát hexagonální architekturu v originálním článku od Alistair Cockburna. Naše praxe ale ukázala že v tomto ohledu nepomáhá ani Hexagonální architektura ani obrácení závislostí. Rozeznat co je a co není byznys logika je velice obtížný úkol a pomyslná hranice mezi infrastrukturou a byznys logikou může být v mnoha případech naprosto neznatelná. Tvrdit tedy že přidání nové abstrakce magicky vyřeší tento složitý problém je velice mylné.

Jak můžete vidět využití interfaců ve všech případech nemá velký význam. Existují ale situace kdy je vhodné interface využít – více implmentací jednoho interfacu, branch by abstraction nebo třeba entity v Domain Driven design.

Aplikaci jsme tedy rozdělili na Core a Infrastructure ale zanechali jsme závislost Core na Infrastruktuře. Obrácení závislostí poté používáme pouze pokud je to nutné.

Core

Jádro aplikace jsme nijak nekomplikovali. Většina aplikace neobsahuje žádnou složitou logiku. Z tohoto důvodu jsme nepřidávali žádné zbytečné vrstvy ale většinu logiky jsme dali přímo do Controllerů. Pokud se logika začala komplikovat nebo jsme ji potřebovali využít na více místech zrefaktorovali jsme danou metodu controlleru a přesunuli logiku do entit nebo servis.

V příštím díle se podíváme na testování aplikace.

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google photo

Komentujete pomocí vašeho Google účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s

Tento web používá Akismet na redukci spamu. Zjistěte více o tom, jak jsou data z komentářů zpracovávána.

Vytvořit váš web na WordPress.com
Začínáme