<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 &quot;objetos são referências abençoadas&quot;). A</div><div>
    forma como classes são criadas (com &quot;packages&quot;) e métodos são</div><div>    escritos (com &quot;subs&quot;) 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 &quot;CD&quot; que deve ter</div><div>    atributos como &quot;id&quot;, &quot;title&quot;, &quot;artist&quot;. 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-&gt;{id} = shift; }</div>
<div>            $self-&gt;{id};</div><div>        }</div><div><br></div><div>        sub title {</div><div>            my $self = shift;</div><div>            if (@_) { $self-&gt;{title} = shift; }</div><div>            $self-&gt;{title};</div>
<div>        }</div><div><br></div><div>        sub artist {</div><div>            my $self = shift;</div><div>            if (@_) { $self-&gt;{artist} = shift; }</div><div>            $self-&gt;{artist};</div><div>        }</div>
<div><br></div><div>        &quot;the truth at the end of the package&quot;;</div><div><br></div><div>    onde os acessores funcionam simultaneamente como &quot;setters&quot; e &quot;getters&quot;</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-&gt;new();</div><div>        $cd1-&gt;id(1);</div><div>        $cd1-&gt;title(&#39;Born Again&#39;);</div><div>        $cd1-&gt;artist(&#39;Black Sabbath&#39;);</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-&gt;new( id =&gt; 1, title =&gt; &#39;Born Again&#39;, artist =&gt; &#39;Black Sabath&#39; );</div><div><br></div><div>        print &quot;title: &quot;, $cd1-&gt;title, &quot;\n&quot;;</div>
<div>        # imprime &quot;title: Black Sabbath\n&quot;</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 &quot;é uma meleca&quot; não foi muito técnica e talvez deva ser</div><div>    substituída por algo como &quot;é tão prolixo quanto&quot;. Mas no fim, é uma</div>
<div>    embolação que &quot;meleca&quot; 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 &quot;Class::Accessor&quot; é 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__-&gt;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 &quot;CD&quot; 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>