PHP je věda

Objektově orientované programování nejen v PHP

Domain Driven Design

Domain Driven Design (DDD) je metodou modelování komplexního objektově orientovaného software. Modelování software je přitom silně ovlivněno oborem, pro který má být software vytvořeno. Pojem Domain-Driven Design byl zaveden Ericem Evansem v jeho stejnojmenné knize.

Domain Driven Design vyzdvihuje nutnost modelování objektů tak, aby tento model co možná nejvíce odpovídal reálné situaci. Tento se však nemusí nutně orientovat zaběhnutým business procesům, DDD vyzdvihuje nutnost komunikace a vzájemného se ovlivňování, je tedy možné zaběhnuté obchodní procesy přizpůsobit na software, který má tyto procesy podporovat. Nutností je však všudypřítomný jazyk. Tento jazyk je něco jakoby společný slovník mezi produkt manažery, programátory, programem jako takovým a prakticky všemi uživately produktu.

Použití všudypřítomného jazyka tak usnadňuje komunikaci mezi všemi zúčastněnými. Z pohledu webového vývojáře si lze představit situaci, že produktmanažer požaduje import nemovitosti do portálu. V kódu tedy musí být nutně třída s názvem ImportNemovitosti a pokud bude na portálu nápověda ohledně této funkčnosti, název kapitoly se musí jmenovat import nemovitosti.

Kromě všudypřítomného jazyka definuje DDD také základní strukturu kódu. Nejedná se zde však o návrhové vzory, rozhodnutí o použití vhodných návrhových vzorů je přenecháno programátorovi. Pod pojmem struktura kódu je potřeba si představit spíše něco jako základní abstraktní třídy. Tyto základní třídy nazýváme základními doménovými objekty.

Základní doménové objekty

Základní strukturou kódu je rozdělení tříd na datové objekty a služby. Toto rozdělení by mělo být čtenáři známé již z předchozích kapitol. Podstatné je, že service je bezestavový objekt a datový objekt je stavový. DDD však tyto služby a datové objekty dělí ještě dále.

Datové objekty

Služba

Spolupráce doménových objektů

Hlavní poučkou pro vývoj software je, že je potřeba komplexní programátorské úlohy rozdělit do více malých jednodušších úloh. Cest jak docílit tohoto rozdělení je spousta, ale DDD definuje standardní postup. Tento standardní postup snižuje komplexitu tím způsobem, že na první pohled programátor ví, jak se stávajícím kódem pracovat.

Entita

DDD především usnadňuje práci s daty v aplikační vrstvě a to jednak definicí základních stavebních bloků (6 typů tříd výše) a taky základní strukturou, jak spolu tyto bloky komunikují. Pokud se nacházíme v aplikační vrstvě, je základní jednotkou informace entita. Entita je datový objekt. Pokud chceme v aplikační vrstvě pracovat s jakýmikoliv daty, která potom chceme ukládat do databáze, měníme instanci entity, nikdy neměníme data přímo. Entita definuje rozhranní, jaká data je možné uložit, změnit, získat.

Fabrika

Entita vzniká tak, že se vytvoří instance třídy. Instance třídy se vytváří pomocí factory metody. Klíčové slovo „new“ – pomocí kterého se vytváří instance objektu se smí nacházet pouze uvnitř factory metody. Pokud tedy potřebujeme v kódu entitu, vytvoří se pomocí factory metody – nikdy přímo. Zde je ještě nutné zdůraznit zaměnitelnost factory metody s návrhovým vzorem factory. Factory metoda se stará o vytvoření instance konkértní entity, kdežto návrhový vzor factory vytváří objekt s využitím polymorfismu.

Jak taková factory metoda vypadá? V základním pojetí existuje jedna factory třída pro celý modul. Tato factory třída má tolik metod, jako je tříd v projektu. Kadždá metoda vytváří konkrétní instanci třídy. Factory metody usnadňují práci při vytváření komplexních tříd. Pomocí factory metod se nevytvářejí pouze Entity, ale veškeré objekty (služby, agregáty, repositories...).

Repozitář

Většina objektů existuje pouze za běhu programu a při restartu se snadno znovu vytvoří. Entita je však jiná. Pokud se pracuje s entitami, očekává se, že po restartu systému bude možné opět pracovat s daty, které entita obsahovala. Je potřeba tedy mapovat data na Entitu. Tento proces se ve světě Relačních databází nazývá ORM (Object relational mapping). DDD není však vázán na relační databáze. V DDD se o mapování dat z datového úložiště na objekty stará Repozitář. Ať již repozitář vytváří objekty z jakéhokoliv datového zdroje (databáze, REST rozhranní, XML rozhranní), vždy je prací repozitáře to, aby data převedlo z konkrétního formátu na objekt se standardním rozhranním pro jejich zpracování – tedy na entitu. I repozitář musí pro vytváření entit používat factory třídu. Repozitář je zodpovědný i za ukládání dat – tedy převod entity na data ve formátu datového zdroje a uložení těchto dat.

Služba

Pod pojmem služba si většina lidí představí kadeřníka, pokud je člověk informatik, tak si představí pravděpodobně spíše webservice. I když DDD je informatická disciplína, je analogie s kadeřníkem blíže pravdě.

Člověk příjde ke kadeřníkovi s nějakým účesem a odchází s účesem jiným. Zde si můžeme představit účes jako entitu a kadeřníka jako službu. Úkolem kadeřníka je změnit zákazníkovi účes, úkolem služby v DDD je změnit entitu.

Manipulace s daty je základní úlohou jakéhokoliv programu. Program si lze tedy představit taky jako službu. Jenomže pokud by byl program modelován jednou jedinou službou, vznikne špagettový kód. V DDD se každá služba může skládat ze spousty dalších služeb. Některé služby s entitami opravdu pracují, jiné služby mohou např. pouze připravovat nějaké mezivýpočty a o entitách nevědí vůbec nic. Základem DDD však je, aby byla služba bezestavová a stav byl ukládán v entitách.

Agregát

Agregát je objekt, který spojuje dohromady více souvisejících doménových objektů. Pod pojmem agregát si pravděpodobně tentokrát i informatik neznalý DDD představí dieselový agregát (čili motor) a ani tentokrát nebude daleko od pravdy. Motor je velmi komplexní zařízení, ale pokud je jednou sestaven, je s ním práce jednoduchá – na základě množství dodaného paliva vytváří točivý moment na klikový hřídel.

Pomocí agregátů lze vytvářet komplexní struktury doménových objektů. Agregát zapouzdřuje logiku a dává k dispozici rozhranní pro snadnou komunikaci s okolím.

Value Object

Value Object reprezentuje informaci, která nemá identitu. Velmi často užívaným příkladem pro value object je např. objekt Money – zajímá nás pouze hodnota peněz, nezajímá nás jestli je to přesně ta či ona bankovka. Podobně je to se všemi základními datovými typy (integer, string, etc...).