Valeu Eden

Então, eu li sobre o "rebless" depois de ter implementado. Acho ate que é
uma solução mais elegante.

Porém se os internals do DateTime forem alterados, os meus testes vão
quebrar. Não é muito confiavel isso mas é interessante de se pensar.

Outra coisa que eu estava vendo é que o Enable é muito confuso. Seria mais
facil, num problema em produção, comentar a linha que adiciona o meu modulo
e mandar bala. Ou adicionar este módulo caso a configuração permita.

2013/1/9 Eden Cardim <[email protected]>

> The following message is a courtesy copy of an article
> that has been posted to gmane.comp.lang.perl.perl-mongers.saopaulo as well.
>
> >>>>> "Tiago" == Tiago Peczenyj <
> [email protected]> writes:
>
>     Tiago> Oi Galera Me foi passado um exercicio bem interessante
>     Tiago> sobre "corrigir" um comportamento da classe DateTime.
>
>     Tiago> O default time zone da classe DateTime é UTC, porém alguem
>     Tiago> ignorou isso e desenvolveu uma boa quantidade de coisas,
>     Tiago> colocou em produção, etc, só descobriu q tinha algo errado
>     Tiago> quando alguns testes falhavam em alguns horarios
>     Tiago> específicos. No caso algumas coisas estavam em EST (como o
>     Tiago> banco de dados) e para resolver isso "logo", no lugar de
>     Tiago> alterar o sistema (por medinho, tempo, etc) resolveram
>     Tiago> fazer algo mais grosseiro.
>
>     Tiago> A minha solução ficou assim:
>
>     Tiago> https://github.com/peczenyj/Fix-DateTime
>
>     Tiago> Acho que esta menos pior do que poderia ser, mas ainda
>     Tiago> fede. Não é exatamente um Fix, mas resolve algumas coisas.
>
> Algumas considerações:
>
> - Não precisa mudar todos os métodos, só um wrapper no ->new() já
>   basta. Com esse tipo de alteração, quanto menos intrusivo você for,
>   melhor, vai que alguém decide mudar algo nos internals e colocar o
>   new numa classe base, aí o DateTime::new vai deixar de existir e vai
>   quebrar o wrapper.
>
> - Apesar do Michael Schwern achar bacana o uso de "goto &sub;" porque
>   faz parecer que o wrapper não está lá, eu detesto essa construção
>   exatamente por esse motivo. Essa forma de invocação do goto
>   sobrescreve a chamada atual da stack com a nova chamada, em algumas
>   situações isso pode virar um pesadelo de depuração quando outra
>   pessoa pegar o código e não entender porque raios o time_zone está
>   em EST quando a doc diz que é UTC (logo em seguida ele vai começar a
>   programar em Java, dizendo que Perl é uma merda).
>
> - É possível que o teu bloco BEGIN execute antes do BEGIN implícito do
>   use DateTime em algum outro lugar do seu código, por isso você
>   precisa carregar o DateTime explicitamente.
>
> Eu implementaria assim:
>
> use DateTime;
> our ENABLE = 1;
> our %defaults = (time_zone => 'EST');
>
> BEGIN {
>   if($ENABLE) {
>     my $sub = DateTime->can('new')
>       or die "AVISO: Método DateTime->new sumiu, ISSO VAI QUEBRAR O
> SISTEMA TODO";
>     *DateTime::new = sub {
>        my($class, %args) = @_;
>        $class->$sub(%defaults, %args);
>     };
>   }
> }
>
> --
> Eden Cardim -- Insolide Soluções de TI Ltda.
> +55 11 9644 8225
> http://insoli.de
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: [email protected]
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj
=begin disclaimer
   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: [email protected]
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a