Не будем подробно останавливать на самой идее использования шаблонов, считая читателя знакомой с ней (иначе рекомендуем вначале ознакомится с идеями FastTemplate для Perl или PHP, Smarty для PHP).
Под шаблонами понимается не то, что является шаблонами в терминологии .NET, мы рассмотрим достаточно старую и хорошо себя зарекомендовавшую в других языках веб-программирования (PERL, PHP) технологию шаблонов дизайна. Будем называть их в дальнейшем именно так - шаблоны дизайна, чтобы избежать путаницы.
Итак, одной из основных идей шаблонов дизайна является максимально полное разнесение программного кода и его html-представления. Например, когда необходимо вывести приветствие пользователю, подготавливаем шаблон дизайна:
<HTML> <BODY> <P>Добро пожаловать в систему {{FIRST_NAME}} {{LAST_NAME}}</P>
<P>Последний раз вы заходили к нам {{LAST_LOGIN_DATE}}</P> <P>Сегодня {{NOW_DATE}}</P> </BODY> </HTML>
и используем его в обработчике шаблонов. Сообщаем обработчику шаблонов файл, содержащий шаблон дизайна, значение переменных (FIRST_NAME, LAST_NAME, :) после чего можен получить от него обработанный шаблон. Обработка может выглядеть, к примеру, так:
В простейшем случае обработка шаблона представляет собой замену всех переменных в его тексте на их значения.
Что дает использование подобного промежуточного слоя помимо потери ресурсов сервера на дополнительную обработку?
Обычно основными преимуществами такого подхода называют следующие:
разделение программиста и дизайнера - они не мешают друг-другу, могут работать параллельно над одной страницей, при этом вероятность того, что они внесут нарушения в написанный друг-другом код сведена к минимуму.
Программист может не ждать разработки / утверждения дизайна и сразу приступать к работе - он набрасывает черновик дизайна нужной ему страницы (обычно - только переменные и некоторые разделители, чтобы переменные не сливались) и работает с ним. Позже, когда для страницы появится дизайн, верстальщик привяжет его к этой странице (причем программист может об этом даже не знать)
На одну и ту же страницу можно назначать разный дизайн в зависимости от некоторых параметром
Становится гораздо легче сопровождать систему, поддерживать ее, менять дизайн.
Все эти преимущества являются достаточно значимыми при работе с Perl, PHP или ASP. Действительно, одно разделение кода и представление страницы чего стоит - однажды попробовав применить шаблоны дизайна для этой цели, вы уже не сможете заставить себя вернуться к обычной мешанине кода и элементов дизайна (<колбасе>, как презрительно называют ее некоторые программисты).
С приходом ASP.NET ситуация переменилась - эта технология представляет свои пути решения проблемы разнесения дизайна и кода страницы. Для многих программистов, до этого успешно использовавших технологию шаблонов дизайна, стало очень непростым выбором, что делать дальше - продолжать ее использовать (и тем самым отказаться от многих интересных возможностей в ASP.NET, конфликтующих с шаблонами), или, наоборот, отказаться от шаблонов в пользу новшеств ASP.NET?
Тем не менее, есть области, где применение шаблонов дизайна оправданно и сейчас. Рассмотрим два таких примера таких областей.
Оправка почты
Ваш сайт отправляет письма при регистрации новых пользователей, восстановлении забытого пароля или другие? Без сомнения, ответ - <да>.
Текст письма - это текстовка у которой некоторые элементы - переменные. Применение здесь шаблонов дизайна явно напрашивается.
Что это даст?
Тексты писем не будут вкомпилированны в dll сайта - т.е., если нам понадобиться исправить грамматическую ошибку или изменить текст письма, не придется перекомпилировать после этого сайт. Вы просто поправите тестовый файл.
Текст писем может изменять кто угодно, не только программист. Это может делать даже сам владелец сайта.
Вы можете иметь в своей библиотеке кода готовые обработчики шаблонов дизайна для часто встречающихся письм (например, восстановление пароля) и просто добавлять их в проект, изменения потребуется внести только в текст письма.
Такой подход оказывается в итоге, очень удобен, как в программировании, так и в использовании. Накладные затраты на затраты дополнительных ресурсов сервера пренебрежительно малы (особенно если вы используете оптимизированный обработчик шаблонов, грамотно написанный, кэширующий и т.п.)
Одно содержимое, несколько видов представления
Представьте ситуацию, когда у вас на странице сайта отображается некоторое содержимое (например, аналитический отчет). И это содержимое, помимо простого отображения на странице, нужно, во-первых, уметь представить в оптимизированном для печати виде, во-вторых, уметь экспортировать в Excel. Не знаю, как у вас, а в моей практике такие задачи встречаются постоянно.
По сути дела, имеется один обработчик и три вида представления результатов его работы.
Такая задача очень просто решается применением шаблонов дизайна - вы просто имеете три (4, 5, :) разных шаблона. И если потом вас просят добавить к этой странице еще и ссылку <отослать другу>, это не будет вызывать у вас нервных реакций.
Напишем простой обработчик шаблонов для этой задачи
Простой обработчик шаблонов
Итак, напишем простой обработчик шаблонов дизайна, который будет просто заменять переменные в шаблоне на их значения и ничего больше.
/// /// Путь к файлу, содержащему шаблон дизайна /// private string TemplateFile = ;
/// /// Здесь мы будем хранить значения пронициализированных переменных /// private Hashtable Variables;
/// /// Открываем файл, содержащий шаблон дизайна, попутно проверяя его существование /// /// public void OpenTemplate ( string TemplateFullPath ) { if ( File.Exists( TemplateFullPath ) ) { TemplateFile = TemplateFullPath; } else { TemplateFile = ;
throw new Exception( String.Format(Parser.OpenTemplate: файл {0} не существует, TemplateFullPath) ); } }
/// /// Установка значения переменной в шаблоне дизайна /// /// Название переменной /// Значение переменной public void SetVariable ( string VariableName, object VariableValue ) { Variables[ VariableName ] = VariableValue.ToString(); }
public string ParseToString () { StreamReader _SR = new StreamReader( TemplateFile );
StringBuilder _SB = new StringBuilder();
//Пытаемся прочесть содержимое файла шаблона дизайна try { _SB.Append( _SR.ReadToEnd() ); } catch { //может доступа нет, а может, диск с горячей заменой был... throw; } finally { _SR.Close(); }
// Заменим все переменные в шаблоне на их значения foreach ( string VariableName in Variables.Keys ) { _SB.Replace(Template.Parser.TagOpen+VariableName+Template.Parser.TagClose,Variables[VariableName].ToString()); }
return _SB.ToString(); }
/// /// Конструктор, инициализирует необходимые переменные /// public Parser() { Variables = new Hashtable(); } }