Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos


YAPC Brasil 2010

Comunidade

r1 - 03 May 2010 - BrenoOliveira

O Melhor Sistema de Templates

Sistemas de templates são fundamentais no desenvolvimento web. Mas, diante de tantas opções, qual escolher? Nesse artigo, discutiremos as principais características de 3 famosos sistemas de template em Perl - Template::Toolkit, HTML::Template e HTML::Mason - na esperança de ajudar o leitor a tomar sua decisão.


Em Perl, sempre há mais de uma maneira de se fazer as coisas. Com sistemas de templates não é diferente. O CPAN está cheio de possibilidades, cada qual defendendo suas decisões de design, estruturas e sintaxe, e isso pode assustar iniciantes. Qual escolher? Qual a recomendada?

Veja a seguir um apanhado dos 3 principais sistemas de templates em Perl da atualidade: Template::Toolkit, HTML::Template e HTML::Mason.

Template::Toolkit (TT)

TT é disparado o sistema de templates mais utilizado. Oferece uma micro-linguagem clara e costuma ser considerado muito simples de aprender e usar. Possui vários filtros e extensões, e é o que você vai encontrar mais suporte dentro da comunidade. O código do template é organizado em blocos, por padrão [% e %]. Exemplo:

    [% foo = 'bar' %]
    a variavel foo tem valor "[% foo %]".

    [% IF baz > 42 %]
        isso eh um bloco
    [% ELSIF baz == 42 %]
        outro bloco
    [% ELSE %]
        mooooo
    [% END %]

HTML::Template

HTML::Template encontra-se um pouco desatualizado, com sua última versão datando de 2007, e o site indicado na documentação oficial como "tutorial" simplesmente não existe (nota: artigo escrito em abril de 2010). O código do template fica entre tags <> tradicionais, propositalmente imitando HTML, e precisa de um rótulo específico de declaração para cada variável ou bloco. Você também pode colocar suas tags como comentários para garantir que o template passe por validações antes de ser processado. Outra característica interessate do HTML::Template é que ele se esforça ao máximo para realmente remover toda a lógica de dentro do seu template. O mesmo código acima, versão HTML::Template, não poderia ser realizado - ou pelo menos não sem uma interação maior com o controller do lado de fora do template. Teriamos, no template:

    a variavel foo tem valor "<TMPL_VAR NAME="foo">".

    <TMPL_IF BAZ_TEST_1>
        isso eh um bloco
    <TMPL_ELSE>
        <TMPL_IF BAZ_TEST_2>
            outro bloco
        <TMPL_ELSE>
            mooooo
        </TMPL_IF>
    </TMPL_IF>

E precisaríamos colocar os resultados booleanos dos testes dentro do controller, passados como variáveis ao template. No caso, seria algo como:

    $template->param( 
                  foo => 'bar', 
                  BAZ_TEST_1 => ($baz > 42), 
                  BAZ_TEST_2 => ($baz == 42),
    );

Algumas pessoas tiram vantagem dessa estrutura limitada e refatoram seus templates para que sejam apenas interpolação de variáveis, o que é ideal. Infelizmente não vivemos em um mundo ideal e, na percepção do autor (YMMV), a complexidade e necessidades específicas de determinados sites fazem com que esse formato exija uma sincronização controller-template muito custosa de manter.

HTML::Mason

Finalmente, o HTML::Mason é um formato de template extremamente simplista e, exatamente por isso, extremamente poderoso. Trata-se de um sistema de template que não trabalha com micro-linguagem específica. Generalizando um pouco (mas não muito), ele possui a seguinte regra: linhas começando com '%' são Perl. Você pode colocar código (Perl) inline através de tags <% %> também. Vejamos o exemplo:

    % my $foo = 'bar';
    a variavel foo tem valor "<% $foo %>".

    % if ( $baz > 42) {
        isso eh um bloco
    % } elsif ( $baz == 42 ) {
        outro bloco
    % } else {
        mooooo
    % }

(nota: o framework web Mojolicious utiliza um mecanismo padrão de templates bastante parecido, deliberadamente "emprestado" do Mason)

Fica bem fácil de entender para quem sabe Perl, porém menos legível por ser muito diferente de um documento baseado apenas em tags. Ele traz consigo todo o poder e flexibilidade do Perl, o que pode assustar um pouco - especialmente se o responsável pelo template não for alguém com conhecimento de Perl. Alguns desenvolvedores argumentam ainda que essa facilidade de embutir código Perl pode induzir a má prática de colocar a lógica da aplicação dentro do template.

Conclusão

O HTML::Mason é imediato para quem usa Perl no dia a dia, mas é mais "sujo" de ver em relação a uma micro-linguagem puramente baseada em tags, e pode ser um problema para equipes pouco disciplinadas ou em que o responsável pelo template não conhece Perl. O HTML::Template, por outro lado, é extremamente purista e focado em casos em que fazemos apenas interpolação de variáveis, e a lógica está toda - toda mesmo - do lado do controller, o que na prática acaba não acontecendo ou exigindo muito cuidado de manutenção para acontecer da forma correta. O Template::Toolkit, por sua vez, é um bom balanço entre os dois mundos, oferecendo uma sintaxe de fácil utilização e compreensão, tags limpos e a vantagem de permitir colocar certa lógica no template sem grandes malabarismos (lembrando que muita lógica no template nunca é bom).

O recomendado? Aquele que melhor atende o seu jeito de pensar wink