[SP-pm] E eu não usei AUTOLOAD... [Was: Boas vindas ao Igor Sutton Lopes]

Adriano Ferreira a.r.ferreira em gmail.com
Quarta Fevereiro 14 01:55:58 PST 2007


On 2/14/07, Luis Motta Campos <luismottacampos at yahoo.co.uk> wrote:
> On Feb 13, 2007, at 6:26 PM, Igor Sutton wrote:
> >>    Ainda sobre o AUTOLOAD:
> >>    1. Quem usa? Prá que usa?
> >
> > Eu nunca usei. Na verdade acredito que você utiliza o AUTOLOAD prá
> > coisas mágicas que 99% das pessoas não necessitam utilizar.
> [sniiiiiip]
> >>    2. Quem usa, alguma vez sobrecarregou o UNIVERSAL::can() para
> >> condizer com o que você faz no AUTOLOAD? Como?
> >
> > Eu li algo a respeito disso no best practices do Damian. Segundo ele é
> > um pé-no-saco fazer isto funcionar direito e pode levar a bugs quase
> > imperceptiveis.
> >
> > A regra geral é: não use :-)
>
>    Eu acho uma merda ter poder e não usar.
>    Não acredito que um recurso possa ser implementado sem necessidade.
>    A gente precisa é descobrir a melhor forma de usar.
>    Geração de código dinamicamente é uma das vantagens da linguagem
> ser interpretada, se a gente abrir mão disso é melhor começar a usar
> Java de uma vez... :-P
>
>    Queria ler mais opiniões à respeito... alguém se habilita?

O AUTOLOAD já foi mais usado. Mas ele serve para muitas coisas.
Muitas? É. Quais? Ham. Ham. Deixa eu ver:

* é o coração dos módulos de carga dinâmica como o AutoLoader e o SelfLoader

* é ótimo para implementar delegação -- o objeto pode delegar métodos
  para um atributo sem saber que atributo é este (quer dizer, sem saber
  qual a sua classe) e decidindo em tempo
  de execução se é possível responder a um dado método

* módulos como o Shell criam/instalam rotinas automaticamente
  quando o método não é encontrado e o AUTOLOAD é invocado.
  Assim na segunda vez que o método é chamado, ele já está lá.

* serve para implementar Acme::CNA,

Amce::CNA - a moer tolernat verison of mehtod location

  package Riddle::Tom;
  use Amce::CNA;

  sub tom_marvolo_riddle {
    return "That's me!";
  }

And then...

  print Riddle::Tom->i_am_lord_voldemort;
  # => "That's me!"

Em geral, programar corretamente com AUTOLOAD é difícil -- se o que
você estiver fazendo for complexo. Isto tudo por causa dos detalhes,
como alguém citou o Damian falando da dificuldade de programar algumas
coisas do modo certo e o Luís também falou da consistência que pode
ser quebrada se você não acompanha a criação do AUTOLOAD com uma
sobrecarga de ->can. Mas tudo isto pode ser minimizado por disciplina
e escrevendo testes.

Meus R$ 0,02.

Adriano.


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