<div dir="ltr">Só reafirmando o que foi escrito pelo pessoal :<div><br></div><div style><div class="gmail_extra" style><br><div class="gmail_quote" style>Em 22 de março de 2013 20:27, Marcio - Google <span dir="ltr"><<a href="mailto:marciorp@gmail.com" target="_blank">marciorp@gmail.com</a>></span> escreveu:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Mongers,<div style><br></div><div style>Mais algumas dúvidas sobre "boas práticas".</div>

<div style><br></div><div style>1. Tenho algumas funções (sub) que são comuns a mais de um aplicativo. Qual a forma mais simples, prática e elegante de compartilha-las entre vários scripts, sendo que todos ficam no mesmo diretório? Hoje, tenho o mesmo código repetido dentro do arquivo de cada script.</div>


<div style><br></div></blockquote><div><br></div></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>estou assumindo que vc possui um subset de código comum e que será consumido por diversos scripts diferentes. A melhor maneira de fazer isto, é através de módulos ! Cria um namespace para você e organize estes códigos no name espace, mas atenção para o ORGANIZE.</div>

<div style><br></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>Então criei, por exemplo, o MINHAEMPRESA::Util::DB para os códigos de banco de dados, por exemplo. Mas faça isto de maneira muito genérica, evitando coisas muito específicas como por exemplo que o código destes módulos tenha usuários, senhas e diretórios. Estas coisas específicas devem ser parametros.</div>

<div style><br></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>Este módulo pode ser instalado no sistema, ou vc pode colocar ele numa estrutura de diretório e utlizar o 'lib' para especificar onde o script tem que procurar o módulo.</div>

</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><br></div></div></div></div></blockquote>

<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>Vou dar um exemplo de como um módulo de código comum deve ser genérico.</div>

<div style><br></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><code></div>

</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><div><font face="courier new, monospace">package MINHAEMPRESA::Util::DB;</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">use Moose::Role;</font></div><div><font face="courier new, monospace">use namespace::clean -except => 'meta';</font></div>

<div><font face="courier new, monospace">use DBI;</font></div><div><font face="courier new, monospace">use DBIx::Connector;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">has db_server   => ( is => 'rw', isa => 'Str', default   => 'localhost' );</font></div>

<div><font face="courier new, monospace">has db_user     => ( is => 'rw', isa => 'Str' );</font></div><div><font face="courier new, monospace">has db_password => ( is => 'rw', isa => 'Str' );</font></div>

<div><font face="courier new, monospace">has db_database => ( is => 'rw', isa => 'Str' );</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">has connection => (</font></div>

<div><font face="courier new, monospace">    is      => 'ro',</font></div><div><font face="courier new, monospace">    isa     => 'Any',</font></div><div><font face="courier new, monospace">    lazy    => 1,</font></div>

<div><font face="courier new, monospace">    builder => '_builder_conn'</font></div><div><font face="courier new, monospace">);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">sub _builder_conn {</font></div>

<div><font face="courier new, monospace">    my $self = shift;</font></div><div><font face="courier new, monospace">    my $dsn  = sprintf "DBI:mysql:database=%s; host=%s",</font></div><div><font face="courier new, monospace">                    $self->db_database,</font></div>

<div><font face="courier new, monospace">                    $self->db_server;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    return DBIx::Connector->new(</font></div>

<div><font face="courier new, monospace">                $dsn,</font></div><div><font face="courier new, monospace">                $self->db_user,</font></div><div><font face="courier new, monospace">                $self->db_password,</font></div>

<div><font face="courier new, monospace">                { 'RaiseError' => 1,</font></div><div><font face="courier new, monospace">                  'mysql_enable_utf8' => 1,</font></div><div><font face="courier new, monospace">                  'AutoCommit' => 1} );</font></div>

<div><font face="courier new, monospace">}</font></div><div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">sub do {</font></div><div><font face="courier new, monospace">    my $self = shift;</font></div>

<div><font face="courier new, monospace">    my $sql  = shift;</font></div><div><font face="courier new, monospace">    my @data = @_;</font></div><div><font face="courier new, monospace">    my $all  = $self->connection->run( fixup => sub { $_->do( $sql, undef, @data ) });</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    return $all;</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br>

</font></div><div><font face="courier new, monospace">sub execute {</font></div><div><font face="courier new, monospace">    my $self = shift;</font></div><div><font face="courier new, monospace">    my $sql  = shift;</font></div>

<div><font face="courier new, monospace">    my @data = @_;</font></div><div><font face="courier new, monospace">    my $sth  = $self->connection->run( fixup => sub { $_->prepare($sql); } );</font></div><div>
<font face="courier new, monospace">    my $all;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">       $sth->execute( @data );</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    while ( my $ref = $sth->fetchrow_hashref() ) {</font></div>

<div><font face="courier new, monospace">        push @$all, $ref;</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    return $all || [];</font></div>

<div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">42;</font></div></div></div></div></div></div></blockquote><div style>

<div class="gmail_extra" style><div class="gmail_quote" style><div style><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div style></div><div style>2. Tenho algumas funções (sub) que precisam retornar mais de uma informação, as vezes até 5. Hoje como não sei fazer isso, declaro variáveis no inicio do script e antes de chamar a sub, atribuo "undef" para as variáveis. Dentro da sub eu atribuo os valores que preciso a elas e depois da sub eu leio essas variáveis. Não me causa problema, só acho estranho e pouco elegante. Exemplo de retorno: Se deu erro (1 ou 0), Registro que deu erro (numérico), Descrição do Erro (string), Se conseguiu cancelar do IPBX (1 ou 0).</div>

</blockquote><div><br></div></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>Existem várias técnicas, a que você está utilizando tem a desvantagem de utilizar variáveis globais, o que pode ser ok para script (escrevo isto pq como sysadmin e scripts pequenos utilizo bastante), mas considerando a primeira pergunta já não fará sentido utilizar variável global para código reutilizável.</div>

</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>Toda informação para a execução de uma sub tem que estar condida nela, desta maneira se ela recebe dados externos, tem que receber via parametros e se tem que retornar dados, também que que ser de maneira apropriada.</div>

</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style>Estou considerando a tua pergunta do ponto de vista de retorno de resultado, e aí podemos fazer de 2 formas :</div>

</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><ol style><li style>utilizar o return sempre e somente para retornar o resultado e NUNCA erro (no código que eu coloquei acima, só retorno o resultado da interação com o banco)</li>

<li style>na passagem de parametros, informar uma referência que deverá conter o resultado, e o retorno será um valor (código) que indica se ocorreu com sucesso a execução;</li></ol></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><code></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style>

<div class="gmail_quote" style><div style><font face="courier new, monospace">sub foo {</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style>

<div class="gmail_quote" style><div style><font face="courier new, monospace">  my $param_1 = shift;</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style>

<div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">  my $param_2 = shift;</font></div><div style><font face="courier new, monospace"><br></font></div></div></div>
</div>
</blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">  $param_2 = eval { resultado de algum processamento };</font></div>

<div style><font face="courier new, monospace"><br></font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style>

<div style><font face="courier new, monospace">  return 501 if $@;</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style>
<div class="gmail_quote" style>
<div style><font face="courier new, monospace">  return 200;</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style>

<div style><font face="courier new, monospace">}</font></div><div style><font face="courier new, monospace"><br></font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">my $bar;</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">if ( foo($alguma_coisa,\$bar) == 200 ) {</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">   # foi executada com sucesso e por isto estou aqui</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">   say $bar;</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">} else {</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">   # algo não foi bom, então vamos fazer algo diferente</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><font face="courier new, monospace">}</font></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div style><div class="gmail_extra" style><div class="gmail_quote" style><div style><br></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style>

<div class="gmail_quote" style><div style><code><br></div><div style><br></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style>

<div class="gmail_quote" style><div style>Mas a técnica que eu prefiro é morrer quando ocorre um erro. Se ocorreu um erro grave, o teu consumidor precisa saber disto imediatamente, e ele é quem precisa tratar o erro. Então o mesmo código ficaria assim </div>

</div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div class="gmail_extra" style><div class="gmail_quote" style><div style> <span style="font-family:'courier new',monospace">sub foo_with_die {</span></div>

</div></div></div></blockquote><div style><div class="gmail_extra" style><div class="gmail_quote" style><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote">

<font face="courier new, monospace">  my $param_1 = shift;</font></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="courier new, monospace">  my $param_2 = shift;</font></div>

<div><font face="courier new, monospace"><br></font></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="courier new, monospace">  $param_2 = eval { resultado de algum processamento };</font></div>

<div><font face="courier new, monospace"><br></font></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><font face="courier new, monospace">  die { error_code => 500, error_message => $@ } if $@;</font></div>

<div class="gmail_quote"><font face="courier new, monospace"><br></font></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><font face="courier new, monospace">  return </font><span style="font-family:'courier new',monospace">$param_2</span><font face="courier new, monospace">;</font></div>

</div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br>

</font></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><font face="courier new, monospace">my $bar;</font></div></div></blockquote>

<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><font face="courier new, monospace">try {</font></div><div class="gmail_quote"><font face="courier new, monospace"> say foo($alguma_coisa,\$bar) == 200 );</font></div>

</div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote" style><font face="courier new, monospace">} catch {</font></div></div></blockquote>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div class="gmail_extra"><div class="gmail_quote"><font face="courier new, monospace">   # algo não foi bom, então vamos fazer algo diferente</font></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">

<div class="gmail_extra"><div class="gmail_quote"><font face="courier new, monospace">};</font></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote">

<br></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><code><br></div><div><br></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<div style><br></div><div style>3. Declaro as funções (sub) assim:</div><div style>sub NomeDaSub {</div><div style>   my ($NomeDoPrimeiroParametro, ..., $NomeDoUltimoParametro)=@_;</div><div style>}<br clear="all"><div style>

   Está certo? Ou tem uma técnica "mais" correta?</div></div></blockquote><div><br></div><div style>O Marcio Ferreira recomendou um excelente link sobre isto, nos avise se você tiver dificuldade em compreender o conteúdo. E com já escreveu o Vinceguerra, a gente não gosta muito de Uppercase nas variáveis e funções. </div>

<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style>
<div style><br></div><div style><br></div><div style>Em tempo, não estão faltando artigos no Equinócio?</div></div></blockquote><div><br></div><div style>Isto significa que você ainda pode contribuir com algo, mas será preenchido sim. Só estamos numa fase de garantir o wiskey das crianças também.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style><div style><br></div><br>[...]'s<span class=""><font color="#888888"><br>

<br>Marcio
</font></span></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br><br clear="all"><div style><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa
</div></div></div>