2
respostas

Evitar repetição de código em switches

Boa noite a todos

Tenho uma classe Cliente e duas classes que herdam dela PessoaFisica e PessoaJuridica. Estou fazendo um pequeno estudo guardando as referências para vários clientes em um ArrayList que pode ser manipulado para inserir, excluir e modificar clientes. Estou com problemas no método modificar, pois como PessoaFisica e PessoaJuridica têm atributos próprios não podem ser modificadas pelos mesmo método, pensei em usar um switch/case dentro de um do/while para gerar as opções e um stanceof para verificar a classe, mas isso iria gerar "code smells" devido à repetição de codigo, pois as duas classes herdam de Cliente. Gostaria de saber se realmente não há como evitar essa repetição. Vejam o código abaixo.

Obrigado

if(obj instanceof PessoaFisica)
    do{
        //----ATRIBUTOS CLASSE MÃE Cliente - repetido nos dois menus
        System.out.println("0)SAIR");
        System.out.println("1)EDITAR NOME");
        System.out.println("2)EDITAR TELEFONE");
        System.out.println("3)EDITAR E-MAIL");
        //----ATRIBUTOS DA CLASSE FILHA PessoaFisica
        System.out.println("4)EDITAR CPF");
        System.out.println("5)EDITAR RG");
        System.out.println("6)EDITAR CEL");
        System.out.print("Opção: ");
        opcao = sc.nextInt();
        System.out.print("\n");
        sc.nextLine(); //Limpeza de buffer

        //-----codigo repetido nos dois switches
        switch (opcao) {
            case 0:
                System.out.println("Sistema finalizado.");
                break;
            case 1:
                editarNome();
                break;
            case 2:
                editarTelefone();
                break;
            case 3:
                editarEmail();
                break;
        //------------------------------------------        
            case 4:
                editarCpf();
                break;
            case 5: 
                editarRg();
                break;
            case 6: 
                editarCel();
                break;
            default:
                System.out.println("Opção inválida");
        }


    }while(opcao != 0);

} else if(obj instanceof PessoJuridica){

    do{
        //----ATRIBUTOS CLASSE MÃE Cliente repetido nos dois menus
        System.out.println("0)SAIR");
        System.out.println("1)EDITAR NOME");
        System.out.println("2)EDITAR TELEFONE");
        System.out.println("3)EDITAR E-MAIL");
        //----ATRIBUTOS DA CLASSE FILHA PessoaJuridica
        System.out.println("4)EDITAR RAZÃO ESTADUAL");
        System.out.println("5)EDITAR INSCRIÇÃO ESTADUAL");
        System.out.println("6)EDITAR CNPJ");
        System.out.print("Opção: ");
        opcao = sc.nextInt();
        System.out.print("\n");
        sc.nextLine(); //Limpeza de buffer

        //-----codigo repetido nos dois switches
        switch (opcao) {
            case 0:
                System.out.println("Sistema finalizado.");
                break;
            case 1:
                editarNome();
                break;
            case 2:
                editarTelefone();
                break;
            case 3:
                editarEmail();
                break;
        //------------------------------------------
            case 4:
                editarRazaoSocial();
                break;
            case 5: 
                editarInscricaoEstadual();
                break;
            case 6: 
                editarCnpj();
                break;
            default:
                System.out.println("Opção inválida");
        }
    }while(opcao != 0);
}
2 respostas

Oi Frederico, tudo bem?

Uma alteração bem simples para reaproveitar o código que você poderia estar fazendo é isolar a lógica do seu switch para um método, ai você chama o método passando a opcao como parâmetro.

Mas esse código já é de um método. O que eu quero é reutilizar o código de alteração para os atributos da classe mãe.

Mesmo que eu passe a opção como parâmeto, a manipulação dos atributos nome, tel e email irão aparecer tanto no método inserePessoaFisica, quanto no método inserePessoaJuridica e isso é o que eu queria evitar.

Estou tendo o mesmo problema na adição do cliente, code smells. A classe mãe cliente é abstrata e tem duas filhas, PessoaFisica e PessoaJuridica. Para adcionar, utilizei o código abaixo:

private static void adicionaPessoaJuridica() {
        String nome;
        String tel;
        String email;
        String razaoSocial;
        String inscricaoEstadual;
        String cnpj;

        while(true) {
            System.out.print("Nome: ");
            nome = sc.nextLine();
            if(nome.isEmpty()) {
                System.out.println("O cadastro do nome é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("Telefone: ");
            tel = sc.nextLine();
            if(tel.isEmpty()) {
                System.out.println("O cadastro do telefone é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("E-mail: ");
            email = sc.nextLine();
            if(email.isEmpty()) {
                System.out.println("O cadastro do e-mail é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("Razão social: ");
            razaoSocial = sc.nextLine();
            if(razaoSocial.isEmpty()) {
                System.out.println("O cadastro da razão social é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("Inscrição estadual: ");
            inscricaoEstadual = sc.nextLine();
            if(inscricaoEstadual.isEmpty()) {
                System.out.println("O cadastro da inscriação estadual é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("CNPJ: ");
            cnpj = sc.nextLine();
            if(cnpj.isEmpty()) {
                System.out.println("O cadastro da CNPJ é obrigatório");
            }else {
                break;
            }
        }

        PessoaJuridica pj = new PessoaJuridica(nome, tel, email, razaoSocial, inscricaoEstadual, cnpj);
        listaClientes.adicionaCliente(pj);
        System.out.println("Cliente pessoa jurídica adicionado com sucesso!\n");

    }

    private static void adicionaPessoaFisica() {
        String nome;
        String tel;
        String email;
        String cpf;
        String rg;
        String cel;

        while(true) {
            System.out.print("Nome: ");
            nome = sc.nextLine();
            if(nome.isEmpty()) {
                System.out.println("O cadastro do nome é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("Telefone: ");
            tel = sc.nextLine();
            if(tel.isEmpty()) {
                System.out.println("O cadastro do telefone é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("E-mail: ");
            email = sc.nextLine();
            if(email.isEmpty()) {
                System.out.println("O cadastro do e-mail é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("CPF: ");
            cpf = sc.nextLine();
            if(cpf.isEmpty()) {
                System.out.println("O cadastro do CPF é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("RG: ");
            rg = sc.nextLine();
            if(rg.isEmpty()) {
                System.out.println("O cadastro do RG é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("Celular: ");
            cel = sc.nextLine();
            if(cel.isEmpty()) {
                System.out.println("O cadastro do celular é obrigatório");
            }else {
                break;
            }
        }

        PessoaFisica pf = new PessoaFisica(nome, tel, email, cpf, rg, cel);
        listaClientes.adicionaCliente(pf);
        System.out.println("Cliente pessoa física adicionado com sucesso!\n");

    }

O probelam é que o trecho abaixo se repete nos dois métodos.

        String nome;
        String tel;
        String email;


        while(true) {
            System.out.print("Nome: ");
            nome = sc.nextLine();
            if(nome.isEmpty()) {
                System.out.println("O cadastro do nome é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("Telefone: ");
            tel = sc.nextLine();
            if(tel.isEmpty()) {
                System.out.println("O cadastro do telefone é obrigatório");
            }else {
                break;
            }
        }

        while(true) {
            System.out.print("E-mail: ");
            email = sc.nextLine();
            if(email.isEmpty()) {
                System.out.println("O cadastro do e-mail é obrigatório");
            }else {
                break;
            }

Como evitar essa repetição?

Obrigado