Изменения

Template Toolkit

3419 байтов добавлено, 18:15, 23 декабря 2009
Нет описания правки
{{CPAN|Template::Toolkit}} (а также TTk или просто TT) — шаблонизатор, Perl-библиотека для отделения уровня представления от уровня приложения. Короче говоря, относительно простой язык программирования, упрощающий генерацию динамических страниц, в основном, хотя и не обязательно — [[rupedia:HTML|HTML]]-страниц.
Статья [[rupedia:Template_Toolkit|Template Toolkit]] в русскоязычной Википедии говорит пытается намекнуть нам о томна то, что по сути своей это TT — «легковесная» библиотека, в отличие от «полновесных» фреймворков для построения веб-приложений.
== «Не используйте Template Toolkit!» ==
Или же очередная серия «[[:Категория:Заметки об идиотизме|Заметок об идиотизме]]».
Главные минусы TT — воВсе проблемы TT происходят от того, что он ''тьюринг-первыхполный''. Реализовать на нём можно ''ну абсолютно всё, его производительностьчто угодно''. Можно писать на TT, а воне используя нативный Perl-вторыхкод вообще. «Всех» проблем, как это ни парадоксально — богатство возможностейпо сути, провоцирующее на создание сложных две — высокая средняя сложность кода шаблонов и перенос в них половины логики приложенияочень низкая производительность. В итоге идея Идея о простых шаблонах, которые может редактировать даже дизайнер, накрывается медным тазом. Для примера достаточно взглянуть на шаблоны и код Bugzilla.
Производительность TT страдает в первую очередь от {{CPAN|Template::Stash}} (от англ. Забавно, что ''stashсинтаксис'' — тайникTT, «заначка») — зачем-то введённого отдельного уровня хранения данных — по сутиза исключением извращений, собственной реализации хеш-таблицы со множеством наворотовлогичен, проверок и вообще лишних действий, созданной, по всей видимости, для обеспечения нетривиальных возможностей вроде установки функциидаже в [[VMX-getter’а вместо значение переменной шаблона (возможностьTemplate|своём шаблонизаторе]] я пришёл к похожему синтаксису, которой за весь опыт вебв том числе и к передаче переменных единым Perl-разработки лично мне пользоваться не приходилось)хешем. В Stash при каждом получении значения какой-либо переменной передаётся ссылка на массив — путь к этой переменнойС другой стороны, а что как минимум сразу делает невозможным «компилированный» доступ к переменным.же значит «за исключением извращений»? Раскроем смысл фразы — логично в синтаксисе TT всё, кроме:
Так * '''{{CPAN|Template::Manual::VMethods|Виртуальных методов}}''': зачем изобретать свой достаточно сложный язык, где «всё — объект», почему не использовать обычные вызовы функций?* '''Блоков''': «функции» в шаблонах вредны — их полезно выносить в отдельные шаблоны, а если таковых очень много — это, скорее всего, какие-то сообщения, в этом случае их можно объединять в хеш-таблицу и в один файл «локализации», как делает MediaWiki (см. например, [http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesRu.php?revision=60129&view=markup русскую локализацию]).* '''Фильтров''': чем фильтр не функция (имеется ввиду ''внешняя'' функция), зачем вводить дублирующий функционал?* Инструкции '''SWITCH''': её нет даже в самом Perl’е и никто не страдает, зачем же она в шаблонах?* '''Макросов''': чем макрос не блок? Чем макрос не функция? Часто вы используете C-препроцессор в Perl-коде?* '''Встраивания Perl-кода''': вредно для простоты шаблонов, неудобно (ибо Stash) и, возможно, опасно.* '''{{CPAN|Template::Stash|Stash}}''''а (от англ. ''stash'' — тайник, «заначка»): производительность TT страдает в первую очередь именно от него — зачем-то введённого отдельного уровня хранения данных — по сути, собственной реализации хеш-таблицы со множеством наворотов, проверок и вообще лишних действий. «Зачем-то», по всей видимости — для обеспечения нетривиальных возможностей вроде установки функции-getter’а вместо значение переменной шаблона (нафиг в шаблонах такие хаки?).* '''Try/catch''': про то, что это очередная возможность усложнить шаблоны, упоминать как-то даже глупо. Исключения, как известно, придуманы не для шаблонов, а для сложных (по уровню вложенности вызовов функций) конфигураций обработки ошибок, которая в шаблонах опять-таки не полезна, а вредна. Можно было бы подумать, что это всё для обработки ошибок приложения, но лично я считаю, что шаблон ''не должен вызывать функций приложения'' — его предназначение заключается как раз в изоляции уровня приложения от уровня представления.* '''«Обёрток»''' (wrapper’ов): чем это не фильтр, а чем фильтр не функция? Таким образом, остаётся ''приблизительно'' следующий набор: скаляры, хеши и массивы, функции, условный оператор, оператор цикла и включение другого шаблона. То есть, простейшие элементы. Так вот, именно их синтаксис в TT и логичен :-) Кстати, раз обычный Stash — просто кошмар неиллюзорный, а Template Toolkit был (да и до сих пор) весьма популярен, в районе года 2000 появилась его XS-версия (то есть, переписанная на C) — {{CPAN|Template::Stash::XS}}. После этого TT-шаблонам, всё-таки, полегчало. Но, во-первых, Stash никогда не был единственным замедляющим работу TT уровнем, во-вторых, даже Stash::XS всё равно работает не так быстро, как мог бы, а в-третьих, Stash::XS долгое время имел различные баги — например, поддержка UTF-8 в {{CPAN|Template::Stash::XS}} появилась только 4 июля 2009 года.
=== Пример: Bugzilla ===
Но есть и беда: Bugzilla всё ещё использует Template Toolkit, а разрабатывается длительное время и большим числом людей разной степени вшивости :) в итоге люди начинают использовать ''ну, прямо-таки все'' возможности Template Toolkit’а, что ведёт к уже упомянутому анти-паттерну разработки: перемещению 50 % логики в шаблоны.
==== …И её тормоза ====
Практически это приводит к следующим эффектам. Например, открытие бага с большим числом комментариев (например, с 703-емя — это наш максимум в [http://www.custis.ru/ ЗИС]'е) в Bugzilla 2.x, даже с учётом того, что это CGI-скрипт (то есть перезапускается интерпретатор), занимает примерно 1.5 секунды, а в 3.x, даже с учётом того, что это mod_perl (то есть интерпретатор не перезапускается и модули тоже не перезагружаются — ''хочется быстрее, да?'')… примерно 22 секунды, из которых 6 тратятся на работу {{CPAN|Template::Stash}}. После некоторых манипуляций средней хитрости время с 22 сек было доведено до 5.5 секунд, но это всё равно уже никак не 1.5 секунды 2-ой багзиллы, а для дальнейшего прогресса «локальных» улучшений уже мало — нужно глобально менять, так сказать, «архитектурные элементы». Та же история, хоть и менее катастрофическая, с поиском багов — было полсекунды, стало полторы. Некритично, конечно, но где же оно, заявленное «this greatly improves performance and highly decreases the memory footprint»?..