Na obsah stránky

Deklarativně nebo šablonově?

Aleš Roubíček | | # permalink

Kolega Tragéd mi v komentáři k minulému článku sdělil, že moje ukázka je zoufalá. Já s ním tak trochu souhlasím, ale ne úplně.

Spousta kolegů píšících v ASP.NET má za zlatou krávu deklarativní zápis všeho možného do ASPX stránky. I já býval takový. Když jsem viděl někde v kódu <% %>, říkal jsem si fůj. Jenže s postupem času se toho člověk celkem hodně naučí. A začne přicházet na to, že ne vždycky je deklarativní zápis to pravé ořechové.

Vezměme si jako příklad jednoduchý Repeater. To je kontrol pro cyklický výpis dat. Vrazí se mu cokoli, co implementuje IEnumerable nebo je to DataTable, a on to hezky řádek po řádku vyplivne na stránku.

<asp:Repeater runat="server" DataSource="<%# "jedna dvě tři".Split(' ') %>">
  <ItemTemplate><span><%# Container.DataItem %></span></ItemTemplate>
</asp:Repeater>

Pak člověku přijde na mysl, v čem je předchozí kus kódu lepší než ten následující?

<% foreach(string item in "jedna dvě tři".Split(' ')) { %>
<span><%= item %></span>
<% } %>

Já vím, je zoufalej, ale proč? Dělá to samé. A troufnu si tvrdit, že je přehlednější a o něco výkonnější. Sice jsem to nijak neměřil, ale již z podstaty, že nemusím parsovat XML Reapeatru, nemusím instanciovat další třídu Reapeater, projít jejím životním cyklem, databindingem atd.

Vezměte si dál třeba nějakej deklerativní datasource. Třeba ten SqlDataSource, hned porušujete dobré mravy. Stránka by vůbec neměla o nějakém SQLu nic vědět. To patří do úplně jiné vrstvy aplikace. Netvrdím, že je to úplně špatně. Každej ať si dodržuje svoji štábní kulturu.

Dobré na těch dvou ukázkách je to, že si mohu vybrat, který způsob mi víc vyhovuje. Špatné je to, když někdo přes plot křičí, že to co já používám, je zoufalost a že bych se měl zařadit zpátky mezi pravověrné Deklarativisty. Nikdy. Vždycky radši přemýšlej, co je pro daný scénář výhodnější. Mám projekt kde jedna stránka je psaná „postaru“ a další používaj sadu deklarativní komponent. A je to tak v pořádku.

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.