Repository vs Facade vs Model
- Klobás
- Člen | 113
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 | 1280
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
- Pavel Janda
- Člen | 977
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 | 502
@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 | 1032
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 | 1280
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 | 2667
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)