👋 Nový obsah na borekb.cz

Info Tento blog je v "read-only módu" a nový obsah již nebude přibývat. O vývoji píšu na DevBlog.

Reakce na článek o Nette + MVC

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.

Zařazeno do kategorií | |
Michal Blaha (Út, 2009-03-24 20:39):

„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….

Borek (Út, 2009-03-24 21:47):

Michale, pattern != princip. Ve všech autoritativních zdrojích, které jsem o MVC kdy četl (Fowler, Head First Design Patterns atd.,) se o MVC mluví jako o vzoru, nikoliv o principu, a má to dobrý důvod. MVC totiž není jen idea oddělení jakýchsi třech kusů kódu, je to i návod, jak toto rozdělení provést. Existuje mnoho implementací MVC (stejně jako každého jiného vzoru) a taky existuje hodně odvozených vzorů (např. MVP), ale to rozhodně MVC neponižuje na „pouhý“ princip.

Navíc, a to je v článku nejdůležitější, nejde mi ani tak o dohadování, co všechno ještě MVC a je a co už není, ale z výchovného hlediska je hrozně nebezpečné říkat, že MVC stačí brát orientačně. Ideu MVC můžeš zdánlivě úspěšně popsat v pár odstavcích, ale je ošemetné naznačovat čtenářům, že to vlastně stačí. S tím já nesouhlasím.

Michal Blaha (Út, 2009-03-24 22:04):

Ano, neshodneme se ;-), coz je vzhledem k „zavaznosti“ debaty uuuplne sumak. Prenecham tuto spise akademickou debatu i dalsim.

PS: ozvu se ti mimo kvuli Flexu.

Borek (Út, 2009-03-24 23:06):

Ok dobrá, budu se těšit.

Lubos Pavlicek (Út, 2009-03-24 23:48):

V knize od GoF „Design Patterns: Elements of Reusable Object-Oriented Software“ se pod pojmem MVC má na mysli „The MVC triad of classes is used to build user interfaces in Smalltalk-80“. Dnes by se řeklo, že MVC je framework pro tvorbu GUI ve Smalltalku. A autoři se snaží hledat vzory použité v tomto frameworku.

Fowler v knize „Patterns of Enterprise Application Architecture“ již považuje MVC za vzor: „Model View Controller (MVC) is one of the most quoted (and most misquoted) patterns around“. Ale popisuje ho ne jako vzor, ale jako princip, který zdůrazňuje „separating the presentation from the model and separating the controller from the view“. A dále uvádí, že pro první oddělení se obvykle používá vzor Observer. Druhé oddělení se používá výjimečně (a např. ani ve frameworku MVC pro Smalltalk odděleno nebylo) a pokud se implementuje, tak se používá vzor Strategy.

Knihu Head First Design Pattern nemám po ruce, ale pokud si pamatuji, tak MVC je v této knize označeno jako „vzor vzorů“ a ne jako klasický návrhový vzor.

Z výchovného hlediska je chyba označit MVC za vzor. Mnohem vhodnější je MVC věnovat maximálně 5 minut a většinu času věnovat vzorům jako je Observer či Strategy. A kontrolovat, zda tyto vzory naprogramují správně. Pokud někdo prohlásí, že používá/programuje vzor MVC, tak nejlépe ho vytahat za uši.

Borek (St, 2009-03-25 01:03):

Díky, že jste si dal práci s vyhledáním citací, ale toto téma už je opravdu hodně off topic a s hlavní ideou článku nemá moc společného. Navíc si všimněte, že ačkoliv v otázce „MVC – princip nebo vzor“ straním jedné z možností, v článku nezavrhuji ani tu druhou. Máte pravdu, že když vedete kurz, je lepší věnovat se praktickým vzorům, ale to je něco jiného než mít na MVC pár odstavců v článku.

P.S. Ušetřete prosím uši svých žáků, jsou horší věci než nazvat MVC vzorem :)

Aleš Roubíček (St, 2009-03-25 07:13):

Michale ASP.NET není MVC. Je to událostmi řízený komponentový model. Možná je to PageController a TemplateView, ale díky konceptu komponent, nejspíš taky ne. V MVC jde o oddělení zájmů (separation of concerns). CodeBehind/Beside není oddělení zájmů, je tam velice úzká vazba na šablonu.

ASP.NET MVC nemá zrovna nejvhodnější název, stejně jako ASP.NET AJAX, ale to je věc Microsoftu. To, co dělá ASP.NET MVC zajímavým, je snaha o dodržení SOLID principů, zjednodušení testování a odstranění událostí a tudíž přiblížení se k podstatě webového vývoje. To, že je toho trochu docíleno něčím, co připomíná architektonický vzor MVC je skoro nepodstatné. MVC framework dnešní doby sahá za hranice vzoru, který mu dal název.

ASP.NET bylo uděláno tak, aby na webu šlo vyvýjet stejně jako na desktopu. Což v některých scénářích není špatně – v jiných je. :)

Michal Blaha (St, 2009-03-25 21:10):

Alesi, nesouhlasim. ASP.NET je sice udalostmi rizeny komponentovy model – kdyz chci (= nikoliv nutne), ale zakladni koncepce ASP.NET je velmi blizka MVC principu.

v ASP.NET je jak model, tak controler i View ve stejnem vztahu, jako u ASP.NET MVC. Ze v 99% plati vztah Controler:view 1:1 je druha vec (zvyk, prehlednost, lenost…). Realita ukazuje, ze ASP.NET MVC je to stejne.

Na rovinu vsak rikam, ze ja znam ASP.NET MVC tak na urovni prvni verejne CTP a pozdeji jsem to sledoval spise koncepcne (s vyjimkou routingu, ktery povazuji za velmi povedeny) . Vim, ze ASP.NET MVC se docela slusne vyviji a proto dekuji za tvou nabidku z twitteru a prijdu se k tobe podivat a dovolil bych se te pripravit o par minut tveho casu, abys me o plusech MVC presvedcil.

Me je jedno, ze MVC koncept je aktualni hype. Ja vnimam vyhody i „vyhody“ ASP.NET MVC i jeho neprehlednutelnou modnost a duraz na nepodstatne.

Ma vyhrada vuci ASP.NET MVC je pouze jedina: Mam hromadu ASP.NET programatoru. Pokud budu venovat cas a penize na „preskoleni“ lidi na ASP.NET MVC, cas a penize na zahozeni/prepsani existujiciho kodu (komponenty), vrati se mi to? Za jak dlouho a zda vubec ?

Ma nejvetsi a prakticky jedina vyhrada vuci ASP.NET MVC je, ze neni efektivnejsi pro psani Web aplikaci (cas, penize) a neprinasi nic „unikatniho“, nic „must have“. Prechodem na nej nebude muj team o 10,20,30% efektivnejsi. Nezlevnim vyvoj pro sebe a zakazniky o 10,20,30%. Jedine, co se stane je, ze pouziji aktualne modni „technologii“, ktera je pro zakaznika neviditelna (doslova i prenesene) a prinasi jen uspokojeni z toho, ze jedu na modni technologii. A to je pro me malo.

Ac to mozna nevypada, tak ja netrpelive cekam na kohokoliv, kdo me presvedci, ze se mylim.

PS: mozna ze to rozcisne ASP.NET 4+ (nebo spise 5), kde ma dojit k vetsimu a vetsimu „propojeni“ ASP.NET a ASP.NET MVC. Ale porad s komponentami a eventy….…..

PPS: Borku, promin za posun diskuze jinam ;-)

Aleš Roubíček (Čt, 2009-03-26 07:56):

Já osobně nepoužívám ASP.NET MVC protože je in, ale proto, že jsem podobný koncept používal již před prvním CTP v klasickém ASP.NET. A MVC framework mi to hodně usnadňuje, tudíž můžu být (a doufám, že jsem) efektivnější.

Samozřejmě je hloupost čekat, že MVC bude efektivní a výhodné pro každého nebo že někoho donutí psát lepší kód.

Co se týče času na přeškolení. Nedávno k nám nastoupil nový kolega, který MVC nikdy neviděl. Za půl hodiny u whiteboardu dosáhl AHA efektu, pak si ještě skouknul prezentaci z PDC a druhý den byl ready. :)

Ad vzory. Mezi jednotlivými vzory jsou většinou jen lehké rozdíly. Říkat o WebForms, že jde také o MVC je jako tvrdit o kočce domácí, že je v podstatě rys. :)

LLook (Čt, 2009-03-26 14:55):

Něco z ASP.NET 4.0 už bylo k vidění na Mixu: http://session­s.visitmix.com/MIX09/T­46F

Přijde mi to tak, že půjde pouze o vylepšení a dotažení toho, co představili ve verzi 3.5 SP1, nic moc nového. Teda až na ten fungl nový AJAX, ten vypadá fakt slibně.

David Grudl (St, 2009-03-25 11:20):

Předně: jsem moc rád, že článek rozpoutal diskusi, protože na českém internetu je zdrojů o MVC zoufale málo a tohle by mohl být začátek zlepšení.

Bohužel asi právě proto s článek polemizuješ jakožto s „autoritativním úvodem do MVC“, což být nemá, jde o „nenásilný úvod do Nette Frameworku“. Ale neříkám to proto, abych žádal o větší shovívavost. Stále trvám na tom, že MVC můžeme brát jako přesně popsaný architektonický vzor, ale musíme dodat, čí popis a ze kterého roku myslíme. V tom se třeba od vzoru singleton docela liší ;)

Na všechny další výtky odpovím otázkou: je lepší perfektní výklad bez zjednodušení, ve kterém by se čtenář ztratil a ty bys byl spokojen, nebo efektní řešení na začátku, na kterém mohu v dalších dílech provádět refaktoring s komentářem?

Borek (St, 2009-03-25 13:54):

Nezbývá tedy, než se těšit na další díly :)

Martin Prokeš (St, 2009-03-25 11:37):

David Grudl si o sobě možná myslí, že je programátorská celebrita, ale koneckonců, je to jen PHPkář samouk. Proto je nutné jeho výroky brát s rezervou. Tím více o objektovém programování a MVC. Je škoda, že má takový vliv na začátečníky, ale PHP je synonymem špatného programovacího stylu, takže to zase tak nevadí. Kdo četl jeho kód, případně navštívil přednášku nebo školení, ten to vidí sám. Pro mě osobně spadá někam mezi Aleše Slabého a Radka Hulána.

martin (St, 2009-03-25 17:04):

uff, prihodite aj nejaky priklad toho nespravneho kodu spolu s vasim lepsim riesenim, alebo ste si potreboval len tak kopnut? ze by zavist?

Michal Blaha (St, 2009-03-25 21:17):

Neni nad trochu osobnich utoku. :-(

Ja nemam o PHP zadne dobre mineni, ale neodolal jsem, ale Nette jsem si prohlizel. A chapu, ze pro PHP komunitu je to pomerne revolucni zalezitost, prinasejici do PHP web vyvoje spoustu rozumnich konceptu a rozumny objektovy model.

A videl jsem tam spoustu podobnosti s mym oblibenym .NETem a ASP.NET. A to ocenuji. Bez ohledu zda se David inspiroval, ci na to prisel sam.

Pokud bych musel neco na PHP napsat, bez Nette si to neumim predstavit.

PS: otazka pro Davida G. ci ostatni: Funguje Nette ve Phalangeru? http://www.php-compiler.net/

koubel (Čt, 2009-03-26 16:17):

Netestoval jsem, ale asi ne, zejména asi kvůli nedotažené implementaci SPL v Pharlangeru.

Komentáře jsou uzavřeny (blog je v read-only módu). Pokud mě chcete kontaktovat, můžete mailem.