Продолжение рассказа о винтажном велосипеде. Начало тут.
Извините, что затянул с продолжением. Хотелось написать что-то грандиозное (а именно, CRUD), но из-за лени ничего не вышло (может, еще допишу). Так что, к сожалению, вторая часть Марлезонского балета будет немного смазанной :-( В этой статье я представляю обещанный пример классов, производных от Template::Object. Это три класса Template::Input, Template::Input::Text и Template::Input::Select. На этот раз никакого POD'а я не писал, так что пример использования смотрите по unit-тестам.
Сырцы качать отсюда.
Disclaimer. В предыдущей статье я упомянул, что CTPP является правильным шаблонизатором. К сожалению, вынужден опровергнуть своё заявление: в CTPP есть циклы и условные операторы. Моё заблуждение вызвано тем, что в одном хорошем докладе на Highload++ прозвучала фраза про CTPP и про способ его правильного использования в компании докладчика (жаль, не могу вспомнить, чей был доклад). То есть, они просто игнорировали все управляющие конструкции и использовали CTPP для описания голых блоков, а всю логику описывали в представлении.
Update: По наводке Анатолия Шарифулина был вычислен докладчик — Андрей Шетухин и компания — Рамблер (а именно, Рамблер-Почта).
Update #2. В общем, фишка Template::Object в том, что я бы по аналогии с ORM назвал object-template mapping. Создаешь шаблон-объект, инициализируешь его данными в том виде, в котором их тебе удобно передавать, и всё: объект сам знает, что с этими данными делать дальше.
Если необходимо повторное использование поведения объекта с разными шаблонами — это делается простой подменой шаблона, вся логика хранится отдельно. Через наследование и подмену шаблона легко реализуется сходное поведение объекта в различных условиях — скажем, представление одного объекта для пользователей с разным уровнем доступа.
Гибкость: из нескольких кубиков можно собрать кубик Рубика — композиция, из одного кубика можно сделать Borg cube — наследование.
Шаблоны — одно из тех мест, где код практически не используется повторно. Template::Object способен решить эту проблему.
А unit-тесты? Удобно ли вам писать unit-тесты на логику, зашитую в ваши шаблоны? Как часто вы забиваете на тесты по этой причине?
И да, мощность этого метода особенно заметна при использовании convention over configuration.

6 comments: