Blog do TaQ

Conflito de personalidade

Publicado em Developer

O Giuliani Sanches estava falando comigo agora há pouco e me contou de um framework em PHP chamado Akelos, que clama para si ser um port do Ruby on Rails em PHP, como diz em sua página:

Being port of Ruby on Rails to PHP Akelos is also optimized for programmer happiness and sustainable productivity. It lets you write beautiful PHP Code by favoring convention over configuration.

Não cheguei a testar o Akelos, até por que estou bem confortável com o Rails (apesar de ainda manter bastante coisa em PHP), mas, frameworks à parte, estava pensando nas diferenças do que os movem: as linguagens.

Antes de tentar criar qualquer flamewar por aqui, quero pedir que por favor não levem qualquer comparação no post como uma crítica nervosa ou destrutiva para as linguagens, e sim mais como constatação de algumas coisas esquisitas que se fossem diferentes poderiam ajudar bastante em um caso como a construção de um framework, e particularmente, como a minha referência para a questão em particular que vou registrar aqui, pois sempre esqueço onde ficam os meus arquivos de teste para essa situação. ;-)

Algum tempo atrás eu estava fazendo algumas coisinhas em PHP e precisava que uma classe retornasse, através de um método estático, o seu próprio nome. Em um primeiro momento funcionou, porém as classes filhas da classe com o método que retornava o nome da classe insistiam que eram os pais! Conflito de personalidade? Aqui vai um pouco de código para demonstrar isso:

 1 <?php
 2 class Pai {
 3    function name(){
 4       return get_class();
 5    }
 6 }
 7 
 8 class Filha extends Pai {
 9 }
10 
11 print Pai::name();
12 print Filha::name();
13 ?>

Rodando o programa:

[taq@~]php static.php
PaiPai

Ops, parece que há alguma coisa errada ali. Lógico que isso não é o fim do mundo nem impede alguém de fazer alguns ótimos aplicativos usando PHP. Mas com certeza pode ser uma pedra no sapato se você precisar justamente do comportamento correto, ainda mais quando a coisa entra na discussão sobre ser um bug ou o jeito que a linguagem funciona.

Vamos dar uma olhada como isso funciona em Ruby:

 1 class Pai
 2    def self.name
 3       self
 4    end
 5 end
 6 
 7 class Filha < Pai
 8 end
 9 
10 puts Pai.name
11 puts Filha.name

Rodando o programa:

[taq@~]ruby static.rb 
Pai
Filha

Na minha opinião, esse é o comportamento correto, o que vocês acham?

Para finalizar, resolvi fazer o mesmo teste em Java. Rapaz, foi difícil e ainda não cheguei em um resultado conclusivo (não que tenha tentando taaaaanto assim também) pois existe muita discussão sobre esse assunto e me parece que o jeito correto de fazer isso, mas com um comportamento similar ao PHP, é:

 1 class Pai {
 2    public static String name(){
 3       return new Throwable().getStackTrace()[0].getClassName();
 4    }
 5 }
 6 
 7 class Filha extends Pai {
 8 }
 9 
10 public class StaticClass {
11    public static void main(String args[]){
12       System.out.println(Pai.name());
13       System.out.println(Filha.name());
14    }
15 }

Rodando o programa:

[taq@~]java StaticClass
Pai
Pai

Particularmente eu achei a solução meio "remendão", mas nada contra usar Java, afinal, eu uso também, mas putz, podiam ter feito isso de um jeito melhor.


Tags:


Comentários

comments powered by Disqus

Twitter