NHaml это .NET реализация популярного Rails Haml. Поэтому, сначала давайте попробуем понять что такое Haml. Расшифровывается он как XHTML Abstraction Markup Language, то есть это язык разметки для упрощёной генерации XHTML. В нашем арсенале уже имеются средства для достижения подобных целей: XSLT, ASP.NET Web Forms или даже лучше ASP.NET MVC и др. NHaml предоставляет альтернативный способ построения разметки ваших страниц, причем если сам XHTML весьма многословный язык, то NHaml пронизан духом лаконичности. Сокращения, ключевые слова, обозначение блоков — все направлено на сокращение объема кода при максимальном сохранении его ясности. Давайте рассмотрим следующий кусок кода:
ASP.NET MVC (винегрет из кода и html)
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"
CodeBehind="List.aspx" Inherits="MvcApplication5.Views.Products.List" Title="Products" %>
<asp:Content ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
<h2><%= ViewData.CategoryName %></h2>
<ul>
<% foreach (var product in ViewData.Products) { %>
<li>
<%= product.ProductName %>
<div class="editlink">
(<%= Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID })%>)
</div>
</li>
<% } %>
</ul>
<%= Html.ActionLink("Add New Product", new { Action="New" }) %>
</asp:Content>
Эту же разметку (причем сохранив логику ее построения) можно написать и так:
NHaml
%h2= ViewData.CategoryName
%ul
- foreach (var product in ViewData.Products)
%li
= product.ProductName
.editlink
= Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID })
= Html.ActionLink("Add New Product", new { Action="New" })
Как видите, количество кода несколько уменьшилось. Но тут не все так просто. Во-первых, блоки в NHaml обозначаются с помощью отступов, аналогично Python. Т.е. следующий фрагмент кода
%one
%two
%three Hey there
преобразуется в
<one>
<two>
<three>Hey there</three>
</two>
</one>
Можно по-разному относиться к Python’овскому стилю обозначения блоков, но нельзя не признать, что этот способ гораздо удачнее, чем закрывающие теги, используемые в HTML. Во-вторых, первый символ (не считая отсупов) может описывать способ обработки этой строки. К примеру, символ "%" указывает на то, что это XHTML тег. Эти директивы называются правилами разметки и почти совпадают с подобными правилами в родном Haml. Радует и то, что практически все директивы состоят из одного символа (%, =, -, ., #) и во многом похожи(по назначению) на аналогичные CSS директивы, что упрощает освоение языка. А любители верстки div-ами могут наслаждаться тем, что div является тегом по умолчанию, например #header и %div#header - одно и тоже.
Практически на всех веб-проектах от четверти до половины строк кода приходится на HTML-код. Даже с учетом того, что HTML писать проще, чем программный код, можно предположить, что до трети времени будет уходить на создание и отладку шаблонов. Следовательно, за счет использования качественного языка генерации HTML можно выиграть немало времени. В некоторых проектах созданием HTML-кода занимаются отдельные люди, работающие на стыке программирования и веб-дизайна. Для них потенциальный выигрыш будет еще выше.
Таким образом, проблема продуктивного создания HTML-кода является одной из ключевых проблем повышения продуктивности веб-разработки вообще. Не уверен, что NHaml сейчас имеет смысл использовать в коммерческих проектах, так как это еще молодая технология (родилась она где-то в 2007 году). И, как свойственно молодым технологиям (тому же Silverlight), Nhaml довольно радикально меняется от версии к версии. Но, тем не менее, я полагаю, что существует четкая тенденция развития языков разметки в сторону упрощения чтения и редактирования человеком. И хотя, предсказание будущего — штука неблагодарная, особенно в области высоких технологий, осмелюсь сделать ставку на эту (или весьма похожую) технологию построения разметки страниц.
Полезные ссылки
Introducing MonoRail NHAML
Using NHaml, from Source
Use the NHaml View Engine
Блог одного из разработчиков этой технологии