[Resolvido] E aí polimorfismo?

Salve pessoal!

A minha dúvida é basicamente a seguinte:

  • Tenho um arquivo de texto, onde cada linha representa um registro.
  • Cada tipo de registro é diferenciado através do primeiro caractere (ex: ‘a’ identifica cliente, ‘b’ identifica produto, etc…);
  • Para cada registro lido é gerada uma query de inserção no banco de dados (de acordo com o seu tipo);

O que me incomoda nesta situação é que a identificação do tipo de registro (e posterior encaminhamento para a respectiva classe que irá ‘quebrar’ os campos e montar a query) é feita por uma cláusula if-else if que me dá nos nervos sempre que leio.

A pergunta é… existe uma maneira mais elegante de escrever este código?

Grande abraço a todos

Eu tenho uma sugestão, você pode tentar usar Enums pra gerar as suas queries. Nesse código eu usei seus exemplos, deduzindo que existem 2 tipos de query: “a” e “b”.

Peço desculpas se os nomes das classes não fazem muito sentido, nunca fui bom nisso :slight_smile:

Primeiramente nós temos um enum, e nele vai ficar a lógica de como se monta a query de cada tipo:[code]public enum Insert {

a{
    public String gerarInsert(String text) {
        return "Gerar Insert do tipo A";
    }
},

b{
    public String gerarInsert(String text) {
        return "Gerar Insert do tipo B";
    }
};

public abstract String gerarInsert(String text);

}[/code]Com isso podemos ter uma Factory que recebe a linha, descobre qual o tipo pelo primeiro caractere, e instancia o tipo de Insert correto:[code]public class InsertFactory {

public static String gerarInsert(String line){
    //Extrai o tipo do insert
    String tipo = extrairTipo(line);

    //Instancia o objeto que irá construir o insert statement
    Insert insert = Insert.valueOf(tipo);

    //Retorna a String
    return insert.gerarInsert(line);
}

private static String extrairTipo(String line){
    return line.substring(0, 1);
}

}[/code]E um main de exemplo:[code]public class Main {

public static void main(String[] args) {
    String a = "a-information";
    String b = "b-information";

    String aStatement = InsertFactory.gerarInsert(a);
    String bStatement = InsertFactory.gerarInsert(b);

    System.out.println(aStatement);
    System.out.println(bStatement);
}

}[/code]Nessa situação, se existir um caso novo de insert, é só adicionar um novo elemento ao enum.

[quote=PAmaranto]Salve pessoal!

A minha dúvida é basicamente a seguinte:

  • Tenho um arquivo de texto, onde cada linha representa um registro.
  • Cada tipo de registro é diferenciado através do primeiro caractere (ex: ‘a’ identifica cliente, ‘b’ identifica produto, etc…);
  • Para cada registro lido é gerada uma query de inserção no banco de dados (de acordo com o seu tipo);

O que me incomoda nesta situação é que a identificação do tipo de registro (e posterior encaminhamento para a respectiva classe que irá ‘quebrar’ os campos e montar a query) é feita por uma cláusula if-else if que me dá nos nervos sempre que leio.

A pergunta é… existe uma maneira mais elegante de escrever este código?

Grande abraço a todos[/quote]

If bom é if morto:

Rodrigo!

Muito… mas muito legal mesmo a tua abordagem ao meu problema Rodrigo. Nem havia me passado pela cabeça o uso de enum para resolver esta questão.

Finalmente poderei fazer sumir da minha frente aquele arranha-céu de “if” que tanto me incomodava.

Grande abraço.