👋 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.

Z diskuse o MVC

Včera v Microsoftu proběhla diskuze na téma „ASP.NET MVC best practices“, na které byli přítomni nejen lidi od .NETu (Michal Bláha, Aleš Roubíček a řada dalších), ale i zástupci jiných technologií (Karmi – Ruby on Rails, David Grudl – PHP, Honza Král – Django, Vlasta Vávrů – Java a PHP, a určitě další). Díky tomu debata přesahovala svět .NETu, což bylo dobře – díky Jardovi za svolání takové společnosti!

Během večera jsem si udělal pár poznámek k věcem, ke kterým bych se chtěl v tomto zápisku vrátit. Pro mě osobně je nejzajímavější otázka, jestli se MVC ve srovnání s Web Forms vyplatí – vrátím se k ní, ale pěkně po pořádku…

Na začátku se hodně řešilo srovnávání ASP.NET MVC s Web Forms. Zaujalo mě, jak dlouho byla debata orientovaná na uživatelskou stránku věci – řešilo se, jestli se Web Forms aplikace návštěvníkovi dobře používá, jestli jsou třeba Web Forms vhodnější na nějaký typ aplikace a MVC zase na jiný a podobně. Můj názor zde je jasný – uživatel by neměl poznat, na jaké technologii web běží. Dobře udělaný Web Forms web může být stejně dobře použitelný jako MVC web. Pro mě je MVC vs. Web Forms o technologické volbě, která má dopady především na způsob vývoje, jeho efektivitu a podobně (jiná otázka je, jestli je vývoj v MVC skutečně efektivnější než ve Web Forms – o tom níže).

Docela dlouho se řešilo HTTP a jestli je problém, že Web Forms od něj abstrahují. Ne-dotnetisti říkali, že abstrakce od request-response modelu je zásadní chybou Web Forms a že díky tomu je to „mrtvá“ technologie, Tomáš Herceg zase oponoval, že překonat některá omezení HTTP na vyšší úrovni abstrakce může být užitečné. Zde se stavím do druhého tábora, REST přístup je mi sice sympatický a preferuji ho, nicméně proti abstrakci HTTP we Web Formsech nemám vůbec nic. V určitých scénářích to přináší zajímavé výhody, takže proč ne. S MVC to ale moc nesouvisí…

Karmi povídal o některých stále se opakujících problémech, které vídá v cizím MVC kódu. Tyto body platí takřka bezvýhradně i na ASP.NET MVC, takže zde uvedu aspoň nejdůležitější dva:

  • Controller dělá víc, než by měl. Typickou chybou je, že se doménová/business logika dává do Controlleru místo do Modelu.
  • Příliš mnoho začátečníků dává rovnítko mezi Model a databázi, čímž velmi omezují svůj pohled na svět. Osobně bych byl pro, aby se v jednoduchých příkladech pro začátečníky vůbec relační databáze nepoužívala, ale DB jsou „bohužel“ tak dobře podporované v nástrojích a tak běžně se používají jako persistentní úložiště, že je to asi nereálné.

Hodně času jsme potom strávili debatou, jaká funkčnost kam v MVC patří, a tady bylo zajímavé vidět, jak se naše názory někdy drobně, někdy více liší. David s Nette například některou funkčnost, která se v ASP.NET MVC dává do Controlleru, považuje za součást View. Honza s Djangem přišel s pro mě úplně neznámým modelem „Model-Template-View“, Aleš mi cestou do hospody vyprávěl, jak úspěšně kombinuje MVC s MVP, a bavili jsme se i o mnoha dalších detailech, které každý řešíme trochu jinak.

Čím víc podobné debaty slyším, tím víc se mi líbí, co řekl David: návrh aplikace je správný, když je kód tak jednoduchý, že již žádné další vylepšování jeho struktury nezlepšuje jeho čitelnost. Já bych ještě dodal, že dalším důležitým měřítkem je pro mě testovatelnost kódu: moje zkušenost je taková, že testovatelný kód je téměř vždy i dobrý kód. MVC v tomto ohledu velmi pomáhá a aplikaci směřuje správným směrem, ale dobrý softwarový návrh nezaručuje (ve světě ASP.NET viz aféra s „ukázkovou“ MVC aplikací Oxite, která byla zkritizována tak, že to snad už víc nešlo).

Na závěr zásadní otázka, kterou během večera několikrát zopakoval Michal Bláha: je vývoj v ASP.NET MVC efektivnější než ve Web Forms? Když mám tým lidí s desetiletou praxí s Web Forms, vyplatí se mi přechod na MVC?

Moje upřímná odpověď je: nevím. Nějak fungující aplikaci bez důrazu na dobrý návrh je podle mého názoru rychlejší udělat ve Web Forms – komponenty, abstrakce od HTTP, skvělá podpora ve Visual Studiu a podobné věci mají z hlediska času velkou přidanou hodnotu. V MVC musím víc věcí řešit „ručně“, musím toho o HTML, HTTP, JavaScriptu a dalších vědět daleko víc, možná i řádek kódu, které reálně napíšu, bude víc (nevím, nechci se dohadovat).

Ale: napsat kvalitní Web Forms aplikaci je taky časově náročné, jen jinak. Taková aplikace bude nejspíš využívat nějakou variaci vzoru MVP a podle mé zkušenosti je správné použití tohoto vzoru obtížnější než aplikování MVC. Rovněž se v reálu naráží na to, že HTTP/HTML je skryto až moc a je potřeba Web Forms přemlouvat, aby se chovalo podle našeho gusta (v Atlasu například Web Forms radši nahradili vlastním komponentovým frameworkem – ostatní výhody ASP.NET zůstaly samozřejmě zachovány).

Co bych si zvolil já osobně, kdybych stál na začátku nového projektu? Asi by to bylo ASP.NET MVC, ale neumím tu volbu podpořit jednoznačnými argumenty. Styl vývoje v MVC mi zkrátka vyhovuje víc – aplikace má jasnou strukturu, jsem veden k vytváření testovatelného kódu (v jednom projektu jsem došel velmi daleko jen s Modelem, Controllerem a unit testy, aniž bych vůbec řešil View), líbí se mi kontrola nad HTML výstupem a podobně. V současnosti by se mi nelíbilo, že v MVC není úplně jasný koncept znovupoužitelných komponent (typicky např. grid nebo kalendář), ale tyhle věci přijdou: někteří dodavatelé komponent už vytvářejí „MVC controly“ a časem asi vznikne unifikovaný způsob, jak tento problém řešit (něco už je v MVC Futures). RoR a jiné frameworky už možná svoji odpověď dávno mají, nevím.

A kdybych byl expert na Web Forms s řadou vyfintěných komponent a ustálenou architekturou aplikací, která podporuje testovatelnost a udržovatelnost kódu? Podíval bych se na MVC a zkusil, jestli mi náhodou tento styl vývoje nesedne. Jsou lidi, kteří byli experti na Web Forms, a přesto dobrovolně a rádi prchli k MVC. Může se stát. Pak je samozřejmě početná skupina lidí, kteří hype kolem MVC nechápou ani poté, co si MVC vyzkoušeli. A já rozumím – Web Forms nabízí hodně, hodně skvělé funkcionality. Pokud vývojáři umí řešit potenciální problémy, není asi k přechodu na MVC velký důvod.

Náčelníku, tak tak bych to viděl já :)

Díky všem lidem za podnětnou diskuzi!

Zařazeno do kategorií | |
Pepa Štefan (Čt, 2009-06-04 13:36):

Díky za shrnutí. Bohužel jsem se nemohl zúčastnit, tak alespoň takhle si rád počtu, o čem že to vlastně bylo. I tak ale 3 lidi z naší firmy už bylo tak akorát dost.

Jinak – měl jsem za to, že šlo o diskuzi o best pract v APS.NET MVC. S takovou to budete muset uspořádat ještě jednou. Tentokrát bez formsů ;)

Borek (Čt, 2009-06-04 14:42):

Ano, byla to víc debata o MVC obecně než o best practices v něm. Určitě to ale nebylo ke škodě.

MicTech (Čt, 2009-06-04 18:40):

Podle mě, otazky Michala Bláhy jsou špatně položené. Protože WebForms a MVC nejsou tady od toho aby si konkurovali, ale jsou to dvě cesty, které má člověk na startu nějakého projektu.

Jestli se vyplatí přechod teamu, který má za sebou 10letou praxi s Web Forms? Na jednu stranu se programátoři „naučí“ něco nového, ale na druhou jim jejich zkušenosti s Web Forms nebudou moc platné.

Michal Blaha (Čt, 2009-06-04 19:39):

Me otazky nejsou polozene spatne, ale umyslne „provokacne“. Kdyz se vyvojare zeptas proc MVC a ne neco jineho, dostanes hromadu minoritních argumentů shrnutelných do kolonky „protože se mi to libí“ a velmi malo dulezitych. A takto polozene otazky provokuji premysleni z trochu jineho uhlu.

Borek to shrnul pomerne hezky, i kdyz asi kazdy si s diskuze odnesl neco jineho.

Pro mne to bylo presvedceni, ze neni silny argument pro MVC i proti, ale je to i o minulosti a zkusenosti s MVC/neMVC technologii a aktualnim know-how.

A diskuze moc hezky ukazala, ze bez ohledu na technologie, frameworky a postupy se skoro vsude resi podobne az stejne problemy :-)

Aleš Roubíček (Pá, 2009-06-05 08:29):

Sice mám rozepsané své shrnutí, ale trochu tady utrousím, už teď. Mým hlavním důvodem, pro přechod na ASP.NET MVC bylo to, že už jsem tak psal před tím. Jen jsem kvúli tomu musel vynaložit úsilí na víc. Tahle už to mám úhledně připraveno a můžu si vymýšlet další věci. :)

Anonymous (Čt, 2009-06-04 21:12):

Vidíte, a já žil v domění, že jediný důvod pro použití MVC je pevné kontrola nad HTML výstupem obětovaná výměnou za trochu omezený model v podobě toho, že request = action. A naopka, pokud je vám „jedno“, co se vykresluje, tak je rychlejší webform.

veena (Čt, 2009-06-04 21:21):

Pár poznámek. MVT v Djangu je dost podobný koncept, o kterém mluvil David, že View se skládá ze šablony a plniče. V Djangu je plnič tzv view funkce v pythoním kódu a šablona je html soubor s libovolným templatovacím jazykem.

To, že se této View části ve většině web frameworků říká v nesouladu s MVC teorií Controller mi nedávalo smysl když jsem se poprvé s MVC frameworkama potkal a několik let mi to pořád strašilo v hlavě.

A k otázce MVC(P) nebo komponentový-„stavový“ přístup?

Nejlépe využít výhody obojího naráz! A od toho je tu přeci Nette Framework :-) Sic!

MVP + komponenty, které si dokáží držet stav ne v sessions nebo nějakých šílených postovaných viewstate proměnných ale pomocí parametrů v url, které jejich stav definují. Přirozené. Hodně HTTP friendly. Až magické.

Teorie je popsána zde: http://nettep­hp.com/…on-presenter

Jak to vlastně funguje v praxi je možné ozkoušet například stáhnutím příkladu odsud: http://zdrojak­.root.cz/…rk-mvc--mvp/

Anonymous (Čt, 2009-06-04 21:56):

Jo, to jsou ty URL, co se na nich testuje bufferoverflow, co?

veena (Pá, 2009-06-05 09:22):

Jak to myslíte, pane?

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