Repository vs Facade vs Model

Klobás
Člen | 113
+
0
-

Ahoj,

občas si všímám, že někdo používá konvenci v pojmenování modelu jako XXXFacade, někdo zase XXXRepository, někdo XXX model.

Díval jsem se na návrhové vzory a přijde mi, že Repository i Facade je to +/- to samé.

Sdružují vícero modelů do jednoho.

Nebo je to jinak? Jak je to správně?

Co používat?

Díky.

Marek Bartoš
Nette Blogger | 1165
+
+14
-

Model je obecné pojmenování logické vrstvy aplikace. Pro pojmenování konkrétních tříd v modelové vrstvě není příliš přesný, všechno jsou to modely.
Repository je úložiště konkrétního typu dat. Můžeš do něj data vkládat a číst je z něj. Repozitář článků, uživatelů, uživatelských skupin…
Fasáda zapouzdřuje práci s vrstvou pod ní. Může třeba i jen volat metody repozitáře (takže mohou na pohled vypadat identicky), ale stejně tak může provádět výpočetní operace, komunikovat s externí api aj.
V praxi to může vypadat tak, že například pro získání uživatelů máš CreateUserFacade, která se používá stejně v konzoli, ui aplikace nebo rest api. Taková fasáda pak uživatele uloží pomocí repozitáře a například spustí event (UserCreatedEvent), na který mohou navázat další části modelu

Klobás
Člen | 113
+
0
-

@Mabar Super, moc díky za hezké a pochopitelné vysvětlení.

Pavel Janda
Člen | 977
+
+5
-

Ještě bych doplnil jednu věc. Nehledě na teoretické zařazení fasád, repozitářů apod (nikdy jsem neměl tyhle názvy moc rád), mně osobně se osvědčilo v pojmenovávat věci podle toho, co dělají.. Například: UserDataProvider, PasswordGenerator, GameIdCollection, UserHighscoreCache, UserMetadataJsonSerializer atd. Má to jednu výhodu – kdokoliv (třeba já po několika měsících) přijde ke kódu a ví na první pohled, co daný kód dělá. UserRepository a UserFacade jsou super věci, ale na první pohled nikdo nepozná, co může daná třída dělat. Plus to potenciálně vede k hádkám, co by to dělat mělo a nemělo. :D

MajklNajt
Člen | 471
+
0
-

@PavelJanda to čo píšeš vôbec nevylučuje používanie fasád a repozitárov – fasáda ti zjednodušuje rozhranie pre prácu s viacerými objektami/servisami, čiže tie tvoje UserDataProvider, PasswordGenerator, GameIdCollection, UserHighscoreCache, UserMetadataJsonSerializer si nevyžaduješ v presenteri ale si spravíš fasádu, ktorá bude potom jedinou závislosťou presentera. A napr. ten tvoj UserDataProvider tiež zrejme potrebuje k práci nejaký UserRepository (ak sa striktne držíme SRP), čiže podľa mňa to Mabar vysvetlil správne a pomenovania sú namieste :)

Editoval MajklNajt (18. 3. 2020 8:58)

jiri.pudil
Nette Blogger | 1028
+
+2
-

U pojmenování se přikláním k @PavelJanda. Osobně bych třeba i tu zmiňovanou CreateUserFacade nazval prostě UserCreator, a to už je třída, kterou si dovedu představit použitou přímo v prezentační vrstvě. To, že ta třída využívá nějaký návrhový vzor, je její implementační detail; navenek mě zajímá, co dělá, což poznám z jejího názvu a veřejného rozhraní.

Jsou návrhové vzory, kde dává smysl dodržovat pojmenování, protože vyjadřuje, co ta třída dělá (Repository, Factory, …), ale u fasády mi to zrovna smysl nedává.

Marek Bartoš
Nette Blogger | 1165
+
-1
-

Souhlasím, u fasády se to nejspíš dá vypustit. Zatím jsem to dělal jen u entit a value objectů, u fasád se to hodí též.

Editoval Mabar (18. 3. 2020 10:21)

Šaman
Člen | 2634
+
+2
-

Repository dělá poměrně jasně specifikovanou věc. Objektové CRUD nad datovým úložištěm.
Fasáda je „něco složitějšího nad repozitářem, nebo více repozitáři“. Takže ano, tam je dobré popsat co dělá. Fasáda se označuje celá vrstva (v teorii vrstev modelu).

Editoval Šaman (18. 3. 2020 13:32)