Podřízne Razor PHP?

Možná jste zaznamenali vznik nového engine pro ASP.NET s názvem Razor (na Zdrojáku o něm vyšla zprávička. Poměrně nenásilným způsobem kombinuje HTML stránky s jazyky, používanými ve světě .NET, tedy především C# a VB.NET. Má tato kombinace šanci vystřídat PHP na postu „nejjednoduššího jazyka pro vytváření server backendu“?

Tento článek je můj subjektivní názor na novou syntaxi Razor (http://www.as­p.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">
        &copy; 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.muj­server.cz/blog/201­0/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.

Co říkáte na Razor?

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.

Komentáře: 53

Přehled komentářů

alancox Veřejné přiznání
MareceK Re: Veřejné přiznání
pepavondepo Re: Veřejné přiznání
fos4 Re: Veřejné přiznání
ondrah Re: Veřejné přiznání
blizzboz Re: Veřejné přiznání
Martin Malý Rozšíření Razoru brání jediná věc...
KapitánRUM Re: Rozšíření Razoru brání jediná věc...
František Kučera Re: Rozšíření Razoru brání jediná věc...
Michal Augustýn Re: Rozšíření Razoru brání jediná věc...
Tomáš J. Kouba Re: Rozšíření Razoru brání jediná věc...
tom Re: Rozšíření Razoru brání jediná věc...
František Kučera Re: Rozšíření Razoru brání jediná věc...
jozefsevcik Re: Rozšíření Razoru brání jediná věc...
Michal Augustýn Re: Rozšíření Razoru brání jediná věc...
jozefsevcik Re: Rozšíření Razoru brání jediná věc...
Michal Augustýn Re: Rozšíření Razoru brání jediná věc...
František Kučera Re: Rozšíření Razoru brání jediná věc...
Michal Augustýn Re: Rozšíření Razoru brání jediná věc...
jozefsevcik Re: Rozšíření Razoru brání jediná věc...
jozefsevcik Re: Rozšíření Razoru brání jediná věc...
isnotgood Razor podreze maximalne tak sam sebe...
Petr Re: Razor podreze maximalne tak sam sebe...
František Kučera Re: Razor podreze maximalne tak sam sebe...
setka Re: Razor podreze maximalne tak sam sebe...
František Kučera Re: Razor podreze maximalne tak sam sebe...
andy Re: Razor podreze maximalne tak sam sebe...
setka Re: Razor podreze maximalne tak sam sebe...
honza php3
liborse Re: php3
blizzboz Re: php3
honza Re: php3
blizzboz Re: php3
honza Re: php3
Ivan Nový No mnohem zajímavější by bylo,
jozefsevcik Re: No mnohem zajímavější by bylo,
Tomáš Herceg Re: No mnohem zajímavější by bylo,
Michal Augustýn Re: No mnohem zajímavější by bylo,
Tomáš Herceg Re: No mnohem zajímavější by bylo,
Michal Augustýn Re: No mnohem zajímavější by bylo,
Ivan Nový Re: No mnohem zajímavější by bylo,
jozefsevcik Re: No mnohem zajímavější by bylo,
Michal Augustýn Re: No mnohem zajímavější by bylo,
jozefsevcik Re: No mnohem zajímavější by bylo,
Tomáš Herceg Re: No mnohem zajímavější by bylo,
jozefsevcik Re: No mnohem zajímavější by bylo,
pas Re: No mnohem zajímavější by bylo,
Ivan Nový Re: No mnohem zajímavější by bylo,
34535 Re: No mnohem zajímavější by bylo,
František Kučera Java a Google Web Toolkit
Michal Augustýn špatná terminologie - Razor vs. ASP.NET Web Pages
LamiCZ Re: Podřízne Razor PHP?
Koubas Plan9
Zdroj: https://www.zdrojak.cz/?p=3284