Tento článek je můj subjektivní názor na novou syntaxi Razor (http://www.asp.net/webmatrix) pro ASP.NET, který je ovlivněn patnácti lety, kdy se věnuji vzdělávání dospělých v IT, 11 lety vývoje aplikací, frustrací z jednoho projektu a samozřejmě i mou prací na pozici Developer Evangelist. – pozn.aut.
Razor – první pohled
Když jsem se poprvé setkal s novou syntaxí pro ASP.NET, tehdy ještě označovanou jako Plan9, byl jsem vcelku zděšen a vrátil jsem se o deset let zpět, kdy jsem programoval portál www.ipoint.cz v PHP. Jednalo se o klasický živelný vývoj bez koncepce, kdy jsem funkce přidával podle rozmarů zadavatele a počasí, a vše se měnilo ze dne na den. Na druhou stranu po čase byl portál přepsán od základů, nikým jiným než Jakubem Vránou, a funguje velmi úspěšně dodnes.
Když se na toto období podívám zpětně, tak to byla z mé strany přehlídka amatérismu v tom nejhorším slova smyslu. Všechno běželo na jednom jediném počítači, neexistovalo testování, o správě zdrojového kódu jsem neměl ani ponětí, a díky PHP to byl spaghetti kód jako prase, plný dvířek, vlastně vrat, pro SQL Injection. Změnu designu jsem musel dělat pomocí nástroje sed
, protože šablonovací systém jsem nahradil stylem copy & paste. A proč to tak vypadalo?
PHP, tehdy verze 3, mi v podstatě nedávalo nástroje pro čistší styl vývoje, navíc informace o tom, jak dělat rozsáhlé aplikace v PHP, v podstatě neexistovaly. Naštěstí jsem místo MySQL použil PostgreSQL, a tím se vyhnul dalším problémům (než mě začnete kamenovat – potřeboval jsem transakce a úložné procedury, a o tom se v té době MySQL ani nezdálo. Na to by byl už lepší Access). Ono se vlastně stačí i dnes podívat do knížek pro začínající programátory v PHP. O parametrizaci SQL dotazů, kterými se na sto procent vyhnete SQL Injection, o technice connection pooling nebo o šablonovacích systémech se nedozví začátečník vůbec nic, a přitom jsou to věci velmi snadné na naučení i pochopení.
Razor – jeden a půltý pohled
Do našeho oddělení chodí během období maturit na praxi studenti z nižších ročníků středních škol, kterým zadáváme různé práce – většinou překládají technické články z angličtiny. Protože jsem byl ze syntaxe Razor vcelku rozčarován, jednoho studentíka, nepoznamenaného programováním, jsem si vzal jako pokusného králíka, jestli bude Razor fungovat tak, jak byl zamýšlen.
Zásadní problém ASP.NET vs. PHP je takzvaná křivka učení. Když chci začít dělat stránky v PHP, tak mi stačí se naučit relativně málo a jsem schopen něco udělat. U ASP.NET je třeba se toho naučit a pochopit relativně dost, než je člověk schopen udělat svoji první stránku, a to začátečníky velmi odrazuje. Základní myšlenka syntaxe Razor je využití ASP.NET co nejjednodušším způsobem pomocí takzvaných helpers (pomocníků), umožnit začátečníkům rychle napsat svoji první aplikaci, a přitom se toho muset co nejméně naučit.
Studentík se upsal spolužákovou krví, že o Plan9 ani nepípne, jinak přijde do pekla, a začal se sám učit. Řekl bych, že vývoj byl stejný, jako by se učil PHP, ale výsledek byl jiný. Spaghetti kód z principu věci zůstal, ale největší problémy začátečníků, jako je bezpečnost, neefektivní práce s databází a opakování kódu, nikde. Proč?
Razor – druhý pohled
Razor kompletně využívá ASP.NET, ale většinu běžných činností, jako je například výpis dotazu z databáze, maximálně zjednodušuje pomocí helpers
. Nejedná se o nic jiného než o vysokoúrovňové objekty, které zapouzdřují práci s databází, s Twitterem, s validací dat, s ReCaptcha, s Google Analytics atd. Součástí jsou i helpers
pro jednoduchý šablonovací systém, který vychází z Master Pages v ASP.NET, ale je opět zjednodušen.
Co mě docela zaujalo, je využití systému událostí, který činí začátečníkům v ASP.NET vcelku velké potíže. Ze všech událostí, které poskytuje ASP.NET, se vybralo pár, které jsou nahrazeny speciálně pojmenovanými soubory. Potřebuji-li například pro všechny soubory v jednom adresáři nastavit společnou šablonu (Layout Page), stačí vytvořit soubor _init.cshtml a v něm šablonu nastavit. Tento soubor se vykoná dřív než vlastní stránka s obsahem, a proto ji může ovlivnit.
Validace vstupních údajů
Na naprostou nutnost validovat vstupní údaje se v plno materiálech pro začátečníky zapomíná, nebo je toto téma zmíněno velmi okrajově. Razor poskytuje několik velmi jednoduchých metod, které validaci údajů od klienta usnadňují. Příkazem
var Price = Request["Price"];
získáme hodnotu proměnné Price z požadavku klienta (GET, POST). Pomocí metody IsEmpty(), zjistíme, zda uživatel hodnotu vyplnil. Objektem Validation pak můžeme nastavit chybové hlášení:
if (Price.IsEmpty()) { Validation.AddFieldError("Price", "Product price is required."); }
Pokud potřebujete zkontrolovat datový typ, tak stačí použít příslušnou „Is“ metodu, např. IsDateTime() a pomocí metody „As“ provézt příslušnou konverzi, např. AsDateTime().
Práce s databází
Co mě docela zaujalo, je možnost využití SQL Server Compact Edition 4. Jde o malou „embedded“ databázi, která na většinu projektů bude stačit, je kompatibilní s Microsoft SQL Server 2008, a tím pádem je přechod na „velkou“ databázi velmi snadný. Navíc nemusíte řešit nastavení databáze u hostera, protože si ji projekt nese sebou včetně „serveru“. Pokud budeme pokračovat v předchozím příkladu, práce s databází bude vypadat následovně:
var db = Database.OpenFile("SmallBakery.sdf"); if(Validation.Success) { var insertQuery = "INSERT INTO Products (Name, Description, Price) " + "VALUES (@0, @1, @2)"; db.Execute(insertQuery, Name, Description, Price); }
Dotaz je parametrizovaný (@0, @1, @2) a navíc se automaticky využívá connection pooling, který lépe využívá spojení s databází.
Šablonovací systém
Pomocí Layout Pages můžete velmi snadno vytvářet šablony. Stránka s obsahem se na začátku odkazuje na svoji Layout Page, která říká, jak se vykreslují jednotlivé sekce s obsahem. Stránka s obsahem může vypadat například takto:
@{ LayoutPage = "_layout.cshtml"; } @section header { <div id="header"> Chapter 3: Creating a Consistent Look </div> } @section list { <ul> <li>Lorem</li> <li>Ipsum</li> <li>Dolor</li> <li>Consecte</li> <li>Eiusmod</li> <li>Tempor</li> <li>Incididu</li> </ul> } <h1>Multisection Content</h1> <p>Lorem ipsum dolor sit amet.</p>
A příslušná Layout Page (_layout.cshtml) takto:
<!DOCTYPE html> <html> <head> <title>Multisection Content</title> </head> <body> <div id="header"> @RenderSection("header") </div> <div id="list"> @RenderSection("list") </div> <div id="main"> @RenderBody() </div> <div id="footer"> © 2010 Contoso Pharmaceuticals. All rights reserved. </div> </body> </html>
Metoda RenderBody()
vykresluje nepojmenovanou sekci a jednotlivé sekce lze nastavit jako volitelné.
Pěkná URL
Naprosto běžnou záležitostí současných webů je používání „pěkných“ URL. Tuto vlastnost má Razor „by design“. Pokud sestavíte například adresu http://www.mujserver.cz/blog/2010/leden, tak se nejdříve bude hledat stránka blog.cshtml, pokud se najde, tak dostane jako parametr hodnoty 2010 a leden, ke které najdete v poli UrlData. Pokud se nenajde, bude se hledat 2010.cshtml v adresáři blog, atd.
Razor – co s tím?
Z původního zděšení nastalo příjemné překvapení. Pokud se na syntaxi Razor podívám očima začátečníka, tak se jedná o velmi jednoduchý systém na úrovni PHP, a pokud se na to podívám jako programátor s mnohaletou praxí, tak se jedná o systém, který od začátku nutí k dodržování základních bezpečnostních pravidel a dává nástroje pro čistý kód, a to jak jen to je ve světě špaget možné. Začátečník pak může navíc snadno přejít ze syntaxe Razor na normální .NET, který otevírá podstatně více možností než PHP. Například programovat jednočipové počítače, mobilní telefony nebo XBox 360.
Autorem článku je Štěpán Bechynský, specialista pro vývojové nástroje ve společnosti Microsoft v České republice. Informace pro vývojáře také najdete na blogu odborníků z českého Microsoftu.
Přehled komentářů