[SP-pm] Módulo

Igor Sutton Lopes igor.sutton em gmail.com
Terça Março 13 16:06:50 PDT 2007


On 2007/03/13, at 22:39, Thomas Britis wrote:

> Luis Motta Campos wrote:
>>    Claro que não.
>>    Num caso, você tem retornos numéricos (e eu presumo que assuma e
>> teste retornos numéricos em algum lugar do seu código, certo?)
>>    No outro caso, você tem retorno objetivo - o efeito colateral mais
>> importante disto é que te permite encadear chamadas a outros métodos,
>> assim:
>>
>>    $obj->method()->method2()->method3();
>
> 	Minha dúvida é: como posso fazer esse encadeamento? Pensei em algo  
> como:
>

Acredito que o que o Luis quis dizer aqui foi algo do tipo:

<code>
package A;

sub new {
    return bless {}, shift; # nasty way :-)
}

sub function1 {
     my $self = shift;
     ...
     return $self;
}

sub function2 {
     my $self = shift;
     ...
     return $self;
}

package main;

my $a = A->new;
$a->function1()->function2();
</code>

Você pode se perguntar: Mas como eu detecto um erro desta forma, se  
eu sempre retorno a referência para o meu objeto?

Simples:

<code>
# implementação do código da function1:
sub function1 {
     my $self = shift;

     die "Hey, 'key1' does not exists!" unless exists $self->{'key1'};

     # faz algo com $self->{'key1'}
     ...

     return $self;
}

package main;

my $a = A->new;

eval {
     $a->function1()->function2();
};
if ($@) {
     warn "Hey, this error ocurred: $@\n";
}
</code>

Existem outras abordagens para esse tipo de modelagem, como o Error,  
Exception::Class ou o Error::TryCatch. Este último utiliza source  
filtering, o que muitos desaconselham por modificar o código fonte e  
poder introduzir erros que se tornam difíceis de perceber. Acredito  
que outra pessoa na lista possa discutir mais sobre isto, pois  
realmente não tenho conhecimento necessário para tal.

Espero que isto ajude :-)

--
Igor Sutton
igor.sutton em gmail.com



-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20070313/f07e7db2/attachment.html 


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