<div>[Perl 5 - Intermediário] #1 Acessores</div><div> Programação Orientada a Objeto em Perl é algo poderoso, embora cheio</div><div> de idiossincracias (como "objetos são referências abençoadas"). A</div><div>
forma como classes são criadas (com "packages") e métodos são</div><div> escritos (com "subs") tem uma série de vantagens e desvantagens.</div><div><br></div><div> Uma das coisas mais comuns é criar *setters* e *getters* para os</div>
<div> atributos de um objeto, como uma representação de "CD" que deve ter</div><div> atributos como "id", "title", "artist". Para criar estes métodos, a</div><div> forma tradicional é decidir pela representação de um objeto como um</div>
<div> *hash ref* e escrever:</div><div><br></div><div> # CD.pm</div><div> package CD;</div><div><br></div><div> sub new {</div><div> my $proto = shift;</div><div> my $class = ref $proto || $proto;</div>
<div> my $obj = bless {@_}, $class;</div><div> return $obj;</div><div> }</div><div><br></div><div> sub id {</div><div> my $self = shift;</div><div> if (@_) { $self->{id} = shift; }</div>
<div> $self->{id};</div><div> }</div><div><br></div><div> sub title {</div><div> my $self = shift;</div><div> if (@_) { $self->{title} = shift; }</div><div> $self->{title};</div>
<div> }</div><div><br></div><div> sub artist {</div><div> my $self = shift;</div><div> if (@_) { $self->{artist} = shift; }</div><div> $self->{artist};</div><div> }</div>
<div><br></div><div> "the truth at the end of the package";</div><div><br></div><div> onde os acessores funcionam simultaneamente como "setters" e "getters"</div><div> (o que é comum em muita programação Perl) e se usa desta forma:</div>
<div><br></div><div> use CD;</div><div><br></div><div> my $cd1 = CD->new();</div><div> $cd1->id(1);</div><div> $cd1->title('Born Again');</div><div> $cd1->artist('Black Sabbath');</div>
<div> # perceba que esta apenas é uma ilustração</div><div> # didática e ingênua:</div><div> # o objeto pode ser criado</div><div> # e as variáveis automaticamente</div><div> # preenchidas simultaneamente </div>
<div> # por um comando como:</div><div> #</div><div> # $cd1 = CD->new( id => 1, title => 'Born Again', artist => 'Black Sabath' );</div><div><br></div><div> print "title: ", $cd1->title, "\n";</div>
<div> # imprime "title: Black Sabbath\n"</div><div><br></div><div> Obviamente que o código acima é claramente redundante e chato. Se Perl</div><div> é deste jeito, talvez programar em Java tenha mais *sex appeal*. Pelo</div>
<div> menos lá, eu nem tenho de ficar referenciando o objeto sobre o qual o</div><div> método foi invocado (o *$self*).</div><div><br></div><div> package <a href="http://namespace.too.long.for.seemingly.respectful.java.code.CD">namespace.too.long.for.seemingly.respectful.java.code.CD</a>;</div>
<div><br></div><div> private int id;</div><div> private String title;</div><div> private String artist;</div><div><br></div><div> # getters</div><div> int get_id() { return id; }</div><div>
int get_title() { return title; }</div><div> int get_artist() { return artist; }</div><div><br></div><div> # setters</div><div> void set_id( int id ) {</div><div> <a href="http://this.id">this.id</a> = id;</div>
<div> }</div><div> void set_title( String title ) {</div><div> this.title = title;</div><div> }</div><div> void set_artist( String artist ) {</div><div> this.artist = artist;</div>
<div> }</div><div><br></div><div> Pensando bem, Java é uma meleca com estas declarações todas, e tipos,</div><div> etc. (A frase "é uma meleca" não foi muito técnica e talvez deva ser</div><div> substituída por algo como "é tão prolixo quanto". Mas no fim, é uma</div>
<div> embolação que "meleca" até define bem.)</div><div><br></div><div> Mas não precisa ser assim. (Estou falando do código Perl. Para o Java,</div><div> você pode usar o Eclipse para fazer o serviço sujo e repetir todo este</div>
<div> código para você.) Usar "Class::Accessor" é uma alternativa (entre</div><div> tantas outras) e o nosso código anterior se reduz a:</div><div><br></div><div> # CD.pm</div><div> package CD;</div>
<div><br></div><div> use base qw( Class::Accessor );</div><div> BEGIN {</div><div> __PACKAGE__->mk_accessors(qw( id title artist ));</div><div> }</div><div><br></div><div> 42; # the truth at the end of the package</div>
<div><br></div><div> O mesmo código ilustrado antes para ser usado para construir</div><div> instâncias de "CD" continua válido. Nenhuma repetição desnecessária</div><div> e os acessores são automaticamente criados para você (inclusive</div>
<div> poupando-o de inconvenientes com erros de nomes de variáveis e tal).</div><div><br></div><div> Triangulo-pm, 2008-05-17 19:50</div><div><br></div>