[SP-pm] CGI

Luis Motta Campos luismottacampos em yahoo.co.uk
Quinta Abril 26 00:13:37 PDT 2007


On Apr 26, 2007, at 1:34 AM, André Walker wrote:
> Faz tempo que não escrevo nada, mas sempre leio as discussões que  
> há por
> aqui... E fiquei com uma dúvida.
> Vocês são tão categoricamente contra CGI, e tão a favor de Catalyst...

   Catalyst é a versão mais moderninha, mas eu já usava frameworks  
baseados em MVC para construir aplicações cliente-servidor desde  
1998. Uma das mais destacadas desde então, na minha opinião, mas que  
"morreu" por falta de colaboradores comprometidos (ou não, eu parei  
de acompanhar) é o MyPole.

> Primeiro eu quero entender exatamente o que vocês querem dizer por  
> CGI.
> 1. CGI como uma aplicação interpretada por um interpretador externo ao
> servidor, ou seja, o contrário de "mod_perl", no caso de Perl com
> Apache... (haha, não sei explicar direito :-) )

   CGI é a sigla para Common Gateway Interface.

   Na lista, chamamos "CGI" qualquer programa que implemente este  
padrão.
   Você deve conhecer muitos.
   Não, isso não é o "contrário" de coisa nenhuma, isto não pode ser  
enunciado como uma Álgebra... ;-)

   ModPerl é um conjunto de bibliotecas (para Perl e para o Apache)  
que permite que se escrevam extensões para o Apache em Perl, para  
cada uma das 12(?) etapas de um request, como você já deve saber.

> 2
>    a. O módulo CGI que vem com o Perl...

   Este módulo faz coisas bem bacanas. Mas ele é muito velho, está  
muito maltratado por causa da forma como foi construída e não deveria  
ser mais utilizado, por uma questão de que a gente não pensa mais  
aplicações para a Web daquela forma faz muito tempo. Ele é  
ineficiente, produz código ruim, obriga a programação de improviso e  
a geração de código e HTML no mesmo arquivo (o que é considerado um  
"pecado mortal").

>    b. Qualquer módulo que comece com CGI::

   Calma. Ninguém aqui generaliza nada, por favor.

> Pergunto porque uso CGI::Application. Uso também mod_perl.  
> Pesquisei uma
> comparação entre Catalyst e CGI::Application e não encontrei muita
> diferença... nunca peguei pra programar em Catalyst, mas valeria  
> tanto a
> pena assim?

   O Catalyst tem scripts de ajuda e uma estrutura muito mais  
organizada, simples de implementar e de manter. Ele te obriga a  
modularizar muito mais do que o CGI::Application.

   O CGI::Application é interessantinho, mas é uma classe de muito  
baixo nível. Você precisa extender ele bastante para que ele comece a  
dar bons resultados. Na mão de um novato, é desastre na certa. Agora,  
se você tem uns anitos de estrada, sabe quem são os "Quatro Amigos",  
conhece RUP e usa Test-Driven development, vai conseguir usar isto  
sem grandes dificuldades.

> Outra coisa, uso HTML::Toolkit, mas o Luís sempre indica
> Template Toolkit.... questão de preferência ou é melhor mesmo?

   HTML::Template foi uma das primeiras coisas que eu tentei, 8 anos  
atrás, para parar de usar CGI para gerar HTML na saída.  
Lamentavelmente, ele peca pela penúria de recursos. É ótimo se você  
precisa apenas de coisas simples, mas eu tenho muitas coisas que  
implemento diretamente em TT sem me preocupar mais em escrever um  
módulo para implementar o "View" do MVC.

   É questão de preferência, mas eu recomendo conhecer ambos. Os  
conceitos evoluem, e a gente pode aprender muita coisa comparando.

   Por exemplo, eu gosto de passar objetos DBI::Statement para o meu  
Template, coisa que não posso fazer com HMTL::Template:

   __PERL__
   use strict;
   use warnings;
   use DBI;
   use Template;

   my $dbh = DBI::connect( $dsn, $user, $pass ) or die $DBI::errstr;
   my $query = q{SELECT login, name, email FROM users WHERE login  
LIKE 'l%'};
   my $sth = $dbh->prepare( $query );
   if( $sth->execute ) {
     my $tt = new Template;
     $tt->process( 'user/list.tmpl', { users => $sth } ) or die $tt- 
 >error();
   } else { die $sth->errstr; }

   $sth->finish;
   $dbh->disconnect;
   __END__

   # TT template armazenado em user/list.tmpl:
   [% WRAP 'html/standard_page.tmpl' %]
     [% WHILE ( user = users.fetchrow_hashref ) %]
       <div class="user"> [% user.login %], [% user.name %], [%  
user.email %]</div>
   [% END %]
   # EOF

   Como você pode ver, eu posso manipular objetos Perl de dentro do  
meu Template, coisa que não se pode fazer com o HTML::Template. Por  
causa destas sutilezas, eu prefiro usar o TT. Claro, isto é mesmo  
questão de preferência. E faz muito tempo que eu não codifico nada  
para a web, já que agora eu trabalho no backend dos serviços da  
empresa, construindo parsers (e corretores) para p XML cagado que a  
gente recebe dos fornecedores e clientes. :-(

   Espero que isso ajude.
   Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




Mais detalhes sobre a lista de discussão SaoPaulo-pm