[SP-pm] Fix-DateTime

Tiago Peczenyj tiago.peczenyj at gmail.com
Wed Jan 9 03:47:39 PST 2013


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 <eden at insoli.de>

> 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 <
> tiago.peczenyj-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org> 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 ⊂" 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: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130109/9208ae0f/attachment.html>


More information about the SaoPaulo-pm mailing list