Právě jsem dočetl Davidův článek Nette Framework: MVC & MVP na Zdrojáku, který je důležitý tím, že začátečníci na něj budou koukat jako na úvod do MVC-MVP (věcí specifických pro Nette je v článku relativně málo). Osobně s článkem nemám velký problém, ale pokud ho někdo bude vnímat jako autoritativní úvod do správného psaní aplikací, připadá mi, že některé ukázky nebo poznámky můžou být trochu nebezpečné. Proto bych chtěl sepsat své výhrady, o kterých neříkám, že jsou vždy nutně správné – dávám je spíš k zamyšlení, možná se k nim vyjádří i David sám nebo někdo jiný, kdo je v MVC pečený vařený, ale prostě to musí ven :)
První nepříjemný pocit se dostavil při čtení odstavců o tom, jak není potřeba MVC chápat dogmaticky a že je vhodné to vnímat spíš jako princip, ke kterému existuje hodně implementací. Věcně je to v určitém smyslu pravda (a v jiném smyslu by se šlo dohadovat, že architektonický vzor MVC pro webové aplikace je dost přesně popsán a velmi podobně implementován napříč různými technologiemi), ale pro začátečníka je ona formulace hodně nebezpečná. Programátoři si o sobě myslí, že jsou chytří lidé, takže si po přečtení věty „MVC je spíš princip než konkrétní implementace“ často řeknou „uff, už jsem se bál, že se budu muset učit něco konkrétního, ale on je to jen princip!“. Bohužel po světě běhá až příliš mnoho programátorů, co píšou pseudo-MVC kód a na výtku ohledně kvality kódu odpovídají „můj kód nemůžeš zpochybňovat, je to přece MVC!!“. Máloco je tak frustrujícího, než když vám někdo podobnou větu vpálí do obličeje.
Pokud tedy tenhle zápisek čte někdo, kdo s MVC teprve začíná, vězte, že naučit se MVC je dřina a vyžaduje studium velmi konkrétních návrhových a architektonických vzorů. Časem zjistíte, že implementací existuje víc (obzvlášť hodně kontrastují webové MVC frameworky s přístupy pro tvorbu desktopových aplikací), ale to pro začátek není důležité. Rozhodně nespoléhejte na to, že po pochopení principu („prostě oddělím 3 části aplikace“) budete umět MVC aplikovat – tak krásný svět není :)
Jen pro úplnost – nechci, aby to vypadalo, že tuto věc vytýkám jen článku na Zdrojáku. Podobnou formulaci jsem četl snad už 1000× a je to asi právě proto, proč na mě působí tak trochu jak červený hard na býka :)
Další věci v bodech:
- Citace: „Uvnitř automatu je zásobník na suroviny a mince, tedy databáze. Zásobník je součástí modelu…“ Asi je to jen nešťastně napsané, ale zní to, jako by databáze měla být součástí modelu, což je samozřejmě nesmysl.
- Nelíbí se mi, že se model jmenuje nepopisně „Model“. Něco jako „CoffeeMachine“ by bylo lepší (opět s ohledem na vytváření správných návyků hned od začátku).
- Na MachinePresenteru se mi nelíbí to, jak úzce vázaný je na model. V metodě buy() je „new Model()“ a v konstruktoru je dokonce odkaz na konstantu Model::COFFEE_PRICE, což znamená, že presenter je nepoužitelný pro jiný automat než ten na kávu, ačkoliv analogicky se chová např. automat na jízdenky (abych zůstal u paralel z reálného světa). Neříkám, že úzká vazba je něco hrozného v ukázkovém příkladu, ale lepší architektura je přidat proměnnou typu $machineModel a v jednotlivých metodách se potom odkazovat na ni. Bude tak dodržen Open/Closed Principle a kód prakticky vůbec nenaroste.
- $presenter->link() vypadá jako porušení Single Responsibility principu – proč mám vedle jasných metod jako insert() nebo buy() metodu link(), která má na první pohled dost jiný účel? Související údiv: to má view na presenter tak úzkou vazbu jenom proto, aby mohl vygenerovat URL pro vykonání akce?
Přes všechny výhrady, které jsou výhradami pouze pokud článek bude číst začátečník a bude ho vnímat jako autoritativní zdroj (článek mi tak zní, ale je možné, že David ten úmysl vůbec neměl), je článek krásným úvodem do architektury aplikací v Nette. Je rovněž možné, že některé výhrady, které se zdají jako nedostatky oproti modelu MVC má Nette záměrně (např. pokud Nette nějak rafinovaně podporuje komponenty, může být MVP vhodnější než MVC). Nechci dělat žádné velké závěry, jen jsem chtěl upozornit na pár věcí, co mě při čtení trochu vadily.
„První nepříjemný pocit se dostavil při čtení odstavců o tom, jak není potřeba MVC chápat dogmaticky…“ x "Věcně je to v určitém smyslu pravda "…
Ona je to pravda i fakticky. MVC je proste obecny princip, pattern. A jednotlive „MVC“ implementace dodrzuji obecny princip, par zakladnich navrhovych vzoru, ale rozhodne se neda rici „toto je PRAVY/toto neni MVC“.
A do krve se muzeme dohadovat, ze napr. Microsofti ASP.NET (standartni s viewstate a postback) je MVC stejne tak jako ASP.NET MVC. A pritom mu nikdo MVC nerika.
Takze krome toho, ze si ty dve za sebou jdouci vety odporuji, nesouhlasim s prvni z nich. Prave naopak, MVC je potreba brat s rezervou, nadhledem a nedogmaticky. U proto, ze pristi rok bude hype zase neco jineho….