1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Padrão de Projeto para acabar com ifs excessivos

Bom, estou com um problema de manutenção em uma parte de um código, em que recebo um Array que possui várias linhas de um arquivo de texto que eu preciso ler.

Esse arquivo contém várias variáveis que preciso recuperar o valor, e existe uma gama de possibilidades razoável que posso receber nesse array.

O codigo que fiz para fazer a leitura disso, durante a prototipagem, foi esse:

private GPPacket interpretarArray(List<String> array){
        GPPacket p = new GPPacket();
        for(String s:array){
            if(s.contains(GPAttributes.ESTADO))
                p.setEstado(Integer.parseInt(lerResposta(array,GPAttributes.ESTADO)));
            if(s.contains(GPAttributes.MENSAGEM))
                p.setMensagem(lerResposta(array,GPAttributes.MENSAGEM));
            if(s.contains(GPAttributes.RETORNO))
                p.setRetorno(Integer.parseInt(lerResposta(array,GPAttributes.RETORNO)));
            if(s.contains(GPAttributes.SEQUENCIAL))
                p.setSequencial(Integer.parseInt(lerResposta(array,GPAttributes.SEQUENCIAL)));
            if(s.contains(GPAttributes.SERVICO))
                p.setServico(lerResposta(array,GPAttributes.SERVICO));
            if(s.contains(GPAttributes.TRANSACAO)){
                p.setTransacao(lerResposta(array,GPAttributes.TRANSACAO));
                p.setListaTransacoes(lerListaResposta(array,GPAttributes.TRANSACAO));
            }
            if(s.contains(GPAttributes.TRANSACAO_ADMINISTRADORA))
                p.setTransacaoAdministradora(lerResposta(array,GPAttributes.TRANSACAO_ADMINISTRADORA));
            if(s.contains(GPAttributes.TRANSACAO_AUTORIZACAO))
                p.setTransacaoAutorizacao(lerResposta(array,GPAttributes.TRANSACAO_AUTORIZACAO));
            if(s.contains(GPAttributes.TRANSACAO_CODIGO_VESPAGUE))
                p.setTransacaoCodigoVespague(Integer.parseInt(lerResposta(array,GPAttributes.TRANSACAO_CODIGO_VESPAGUE)));
            if(s.contains(GPAttributes.TRANSACAO_COMPROVANTE_1VIA))
                p.setTransacaoComprovante1Via(lerListaResposta(array,GPAttributes.TRANSACAO_COMPROVANTE_1VIA));
            if(s.contains(GPAttributes.TRANSACAO_COMPROVANTE_2VIA))
                p.setTransacaoComprovante2Via(lerListaResposta(array,GPAttributes.TRANSACAO_COMPROVANTE_2VIA));
            if(s.contains(GPAttributes.TRANSACAO_COMPROVANTE_RESUMIDO))
                p.setTransacaoComprovanteResumido(lerResposta(array,GPAttributes.TRANSACAO_COMPROVANTE_RESUMIDO));
            if(s.contains(GPAttributes.TRANSACAO_DATA))
                p.setTransacaoData(lerResposta(array,GPAttributes.TRANSACAO_DATA));
            if(s.contains(GPAttributes.TRANSACAO_FINANCIADO))
                p.setTransacaoFinanciado(lerResposta(array,GPAttributes.TRANSACAO_FINANCIADO));
            if(s.contains(GPAttributes.TRANSACAO_NSU))
                p.setTransacaoNSU(Integer.parseInt(lerResposta(array,GPAttributes.TRANSACAO_NSU)));
            if(s.contains(GPAttributes.TRANSACAO_OPCAO))
                p.setTransacaoOpcao(lerResposta(array,GPAttributes.TRANSACAO_OPCAO));
            if(s.contains(GPAttributes.TRANSACAO_PAGAMENTO))
                p.setTransacaoPagamento(lerResposta(array,GPAttributes.TRANSACAO_PAGAMENTO));
            if(s.contains(GPAttributes.TRANSACAO_PARCELA))
                p.setTransacaoParcela(Integer.parseInt(lerResposta(array,GPAttributes.TRANSACAO_PARCELA)));
            if(s.contains(GPAttributes.TRANSACAO_PARCELA_VALOR))
                p.setTransacaoParcelaValor(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_PARCELA_VALOR)));
            if(s.contains(GPAttributes.TRANSACAO_PARCELA_VENCIMENTO))
                p.setTransacaoParcelaVencimento(lerResposta(array,GPAttributes.TRANSACAO_PARCELA_VENCIMENTO));
            if(s.contains(GPAttributes.TRANSACAO_PRODUTO))
                p.setTransacaoProduto(lerResposta(array,GPAttributes.TRANSACAO_PRODUTO));
            if(s.contains(GPAttributes.TRANSACAO_REDE))
                p.setTransacaoRede(lerResposta(array,GPAttributes.TRANSACAO_REDE));
            if(s.contains(GPAttributes.TRANSACAO_TIPO_CARTAO))
                p.setTransacaoTipoCartao(lerResposta(array,GPAttributes.TRANSACAO_TIPO_CARTAO));
            if(s.contains(GPAttributes.TRANSACAO_VALOR))
                p.setTransacaoValor(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR)));
            if(s.contains(GPAttributes.TRANSACAO_VALOR_AJUSTE))
                p.setTransacaoValorAjuste(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR_AJUSTE)));
            if(s.contains(GPAttributes.TRANSACAO_VALOR_MINIMO))
                p.setTransacaoValorMinimo(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR_MINIMO)));
            if(s.contains(GPAttributes.TRANSACAO_VALOR_MAXIMO))
                p.setTransacaoValorMaximo(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR_MAXIMO)));
            if(s.contains(GPAttributes.TRANSACAO_VALOR_SAQUE))
                p.setTransacaoValorSaque(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR_SAQUE)));
            if(s.contains(GPAttributes.TRANSACAO_VALOR_TAXA_EMBARQUE))
                p.setTransacaoValorTaxaEmbarque(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR_TAXA_EMBARQUE)));
            if(s.contains(GPAttributes.TRANSACAO_VALOR_TAXA_SERVICO))
                p.setTransacaoValorTaxaServico(Float.parseFloat(lerResposta(array,GPAttributes.TRANSACAO_VALOR_TAXA_SERVICO)));
            if(s.contains(GPAttributes.TRANSACAO_VENCIMENTO))
                p.setTransacaoVencimento(lerResposta(array,GPAttributes.TRANSACAO_VENCIMENTO));
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_INFORMACAO))
                p.setAutomacaoColetaInformacao(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_INFORMACAO));
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_MASCARA))
                p.setAutomacaoColetaMascara(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_MASCARA));
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_MENSAGEM)){
                System.out.println("antes de interpretar a mensagem");
                p.setAutomacaoColetaMensagem(lerListaResposta(array,GPAttributes.AUTOMACAO_COLETA_MENSAGEM));
                System.out.println("depois de interpretar a mensagem, ela tem "+p.getAutomacaoColetaMensagem().size()+" linhas");
            }
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_OPCAO))
                p.setAutomacaoColetaOpcao(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_OPCAO));
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_RETORNO))
                p.setAutomacaoColetaRetorno(Integer.parseInt(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_RETORNO)));
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_SEQUENCIAL))
                p.setAutomacaoColetaSequencial(Integer.parseInt(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_SEQUENCIAL)));
            if(s.contains(GPAttributes.AUTOMACAO_COLETA_TIPO))
                p.setAutomacaoColetaTipo(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_TIPO));
        }
        return p;
    }

Os metodos de leitura utilizados por esse ultimo método são esses:

private String lerResposta(List<String> array, String campo){
        for(String s:array){
            if(s.contains(campo)){
                return s.substring(s.indexOf("\"")+1,s.lastIndexOf("\""));
            }
        }
        return null;
    }

    private List<String> lerListaResposta(List<String> array, String campo){
        List<String> items = new ArrayList<String>();
        int index;
        String temp;
        for(String s:array){
            if(s.contains(campo)){
                index = array.indexOf(s);
                if(array.size()-1>=index+1 && !array.get(index+1).contains("=")){
                    temp = s.substring(s.indexOf("=")+1);
                    temp = temp.replaceAll("\"", "");
                    items.add(temp);
                    index++;
                    while(array.size()-1>=index && !array.get(index).contains("=")){
                        temp = array.get(index);
                        temp = temp.replace("\"", "");
                        if(!temp.equals(""))
                            items.add(array.get(index));
                        index++;
                    }
                }else{
                    items.add(s.substring(s.indexOf("\"")+1,s.lastIndexOf("\"")));
                }
            }
        }
        return items;
    }

Eu estou bastante incomodado com a quantidade de ifs que tenho nesse método, e gostaria de saber se há algum padrão de projeto que me ajude a arrumar essa bagunça.

  • Talvez de para se basear neste exemplo do ViniGodoy http://www.guj.com.br/java/55885-como-nao-utilizar-if-ou-switch#293436

    silasjr   16 de jun de 2015
  • Gostei, vou verificar a possibilidade de implementar isso.

    renangd   16 de jun de 2015
  • Considerando que GPAttributes é um enum seria algo como:

    codigo public enum GPAttributes {

    AUTOMACAO_COLETA_OPCAO { @Override void process(GPPacket p, List array) { // aqui voce adiciona o codigo que esta dentro de cada if p.setAutomacaoColetaOpcao(lerResposta(array,GPAttributes.AUTOMACAO_COLETA_OPCAO)); } };

    abstract void process(GPPacket p, List array);

    } codigo

    silasjr   16 de jun de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java ou faça a sua própria pergunta.