Diskuze: PHP: Rozdělení modelu do vrstev
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Model by měl být jen jeden. Můžeš ho však dědit a přidat mu vždy tu část datové struktury, kterou potřebuješ navíc. Správa více uživatelů v jedné instanci by neměla být problém, dokud nepoužiješ ORM. Pak už to problém je.
Volbu úložiště provádím ve chvíli, kdy vytvářím instanci modelu, resp. konstruktoru modelu předám jako parametr handler otevřeného databázového objektu.
V tomhle případě model bude jen jeden. On vlastně komunikuje jen se servisem, který mu vrací nějaké další instance tříd. V podstatě je to ale jeden model, jen rozdělený do víc vrstev.
Mně přijde totiž dost nelogické pracovat např. ve třídě User s více uživateli nebo že by třída Users reprezentovala jednoho uživatele, to taky nevidím jako dobrý nápad. Navíc ne vždy budu chtít vrátit ten samý DTO. Pro některé to bude třeba Kniha, pro další úplně jiná entita.
V Rails jsem toto řešil tak, že User obsahoval instanční metody pro práci s jedním uživatelem a třídní metody pro práci s více uživateli. V .NET se tento způsob často používá. Na devbooku nemáme ORM, mám tam tedy UserManager, do kterého cpu obojí instančně
Stále mi tam nějak nesedí, že je to všechno v objektu User. User by měl reprezentovat jen jednoho uživatele. Takhle to porušuje Single Responsibility Principe (http://www.zdrojak.cz/…ncipy-solid/ - dál jen SRP). Na Rails jsem teď slyšel kritiku kvůli tomu, že neobsahuje DI, ale to je na jiné povídání.
Ten UserManager se mi ale celkem líbí. To máš jako takové spojení některých těch vrstev, co popisuji výše, ne? Resp. komunikuješ s uložištěm (databází), navenek nabízíš jasně dané rozhraní a vracíš instance User. Problém by ale nastal, kdybych chtěl třeba změnit uložiště za něco jiného než je databáze v průběhu aplikace (třeba Cache). To pak nemůžu jednoduše předat jinou instanci. Musel bych to v UserManageru zjišťovat a to je pak zodpovědný jak za manipulaci s uživateli, tak i za zjišťování, odkud je má brát, což porušuje SRP. Je jasné, že pro uživatele bych to asi nepotřeboval, ber to spíš obecně.
Ono strašně záleží na názoru, Rails třeba míchá GET a POST do jednoho pole. Je to špatně? Je to dobře? .NET je zas plný statiky a funguje to perfektně. Já myslím, že ten návrh je sice velmi důležitý, ale také velmi přeceňovaný.
Na devbooku nemáme ORM, nevracím tedy žádné instance, místo toho vracím jen pole s nějakými daty, co funkce vytahá z DB, případně ještě nějak předpracuje.
Osobně bych hodil statiku na třídu User, tak by dávalo smysl, že jsou metody pro více uživatelů a zároveň by vše bylo na třídě User. Záleží na tom, kolik těch metod je. Ty se asi ptáš na to, kam to rozšiřovat dál, to také nevím, kdyby to bylo dlouhé, založil bych si ještě UserManager.
Já v tomhle hlavně nejsem moc dobrý a ani neuznávám příliš komplikované vzory, beru vše s rezervou, protože jinak by se z toho člověk zbláznil Občas, když vidím cizí kód, tak si říkám... však to znáš
Máš pravdu, asi to moc řeším, jen si nechci uprostřed vývoje uvědomit, že to dělám špatně a že to takhle nebude fungovat. Pro každý controller mám jeden model, takže snad bude stačit použít Nette\Database v jeho metodách pro úpravu databáze. ORM se mi zdá pro moje účely dost zdlouhavé. Máte s jeho implementací zkušenosti (třeba Doctrine 2) nebo bych ORM používat neměl?
Každopádně díky za vaše názory, dost mi to pomohlo
Já mám k ORM neutrální vztah, když ho někde dostanu odladěné, použiji ho, když ne, vyhnu se mu. Co jsem slyšel, tak Doctrine není úplně nejjednodušší, ale nikdy jsem s tím nedělal.
Jestli bys měl nebo neměl používat ORM je otázka pro tebe, je to prostě jeden z přístupů, který má své výhody a nevýhody. ORM se běžně používá v hotových řešeních (Rails, ASP), ale víme, že PHP nic takového nenabízí a naopak existují mraky různých řešení třetí strany. Proto já v PHP ORM nepoužívám, ale třeba bych byl překvapen, že funguje dobře. Dokud budeme pracovat s relační databází, bude to stále kontroverzní téma.
Zobrazeno 8 zpráv z 8.