terça-feira, 25 de setembro de 2012

Podrões de projeto - parte 1

Companheiros e companheiras (voz do lula),

hoje vou publicar um post sobre podrões de projeto.
Encontrei um código aqui na empresa digno de uma análise, pois pra chegar ao resultado obtido se faz necessário muita massa cefálica. Peço desculpas pelo meu português horrivel, mas acho que não atrapalhará na análise de nosso código.

Cerveja bem a classe enum abaixo.
Vejamos o código e depois vamos aos detalhes hehehe



public enum MeuEnum{
        
         NOVO("NOVO"),
         VELHO("VELHO"),
         EM_ABERTO("EM ABERTO"),
               
         private String descricao;

         public String getCodigo() {
                   return this.toString();
         }

         MeuEnum(String descricao) {
                   this.descricao = descricao;
         }

         public void setDescricao(String descricao) {
                   this.descricao = descricao;
         }

         public String getDescricao() {
                   return descricao;
         }       

         public static MeuEnumfromInt(int value) {
                  
                   switch (value) {
                   case 0:  return NOVO;
                   case 1:  return VELHO;
                   case 2:  return EM_ABERTO;                  
                   default: return null;
                   }
         }
        
         public static int retornaOrdinalDaEnum(String value) {
                   int situacao = -1;
                   if (value != null) {
                            if (value.equalsIgnoreCase("NOVO")) {
                                      return NOVO.ordinal();
                            }else if (value.equalsIgnoreCase("VELHO")) {
                                      return VELHO.ordinal();
                            }else if (value.equalsIgnoreCase("EM_ABERTO")) {
                                      return EM_ABERTO.ordinal();
                            }
                   }                 
                            return situacao;
         }
        
}



Veja que nosso amigo programador criou um enum e quis melhorar a descrição apresentada. Então criou um construtor para passar a descrição e um atributo chamado descrição. Tudo lindo até agora.


Um dia eu que precisei dar uma manutenção no código, resolvi usar o outro atributo desse Enum que se chama código, mas para minha surpresa o código não retorna o código hehehe. O código retornava o nome do enum.

public String getCodigo() {
     return this.toString();
}


WTF?!?!?!?!? Fui analisar o código pra saber de onde vem o código, já que o getCodigo() retorna o toString() (hehehe). 
Vi que tinha um metodo fromInt(String value) que recebe um int, tem um switch case que verifica qual valor numerico (código) corresponde com algum valor do Enum. Bem, se tem um código pra cada enum, a pergunta que não quer calar, qual é o método que retorna o código?!

Então chegamos ao último método da classe. O nosso pomposo retornaOrdinaldaEnum(String value) hehehe. Nele nosso grande amigo programador recebe uma String da enum (lembra do getCodigo()???) e te retorna um código! Wonderful! Tirando o tanto de IF e ELSE que existe no método, ele te retorna finalmente o código do enum. ;)


Finalizando nosso brilhante raciocinio, para retornar o código de um Enum, você deve criar um metodo getCodigo() que retorna o toString(), criar um método retornaOrdinaldaEnum() que recebe esse valor e usa no código assim: 

MeuEnum.retornaOrdinalDaEnum(MeuEnum.NOVO.getCodigo())


Podrão de projeto. Retornando código do Enum

À bientôt a tout le monde!



obs.: O enum tinha muito mais valores que não foram mostrados para facilitar a visualização do código. Além de ter o nome e os valores alterados.




2 comentários:

Érico Gomes disse...

Por essas e outras que os projetos atrasam...

Breno Pereira disse...

É um artista do Java !!! hahahaha