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 estudos 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);
}

Nao usaria herança pra tratar requisitos dinâmicos/Negócio. Sempre aquele código que todo mundo tem medo de mexer, pq a generalização pode ferrar com tudo que estiver abaixo. Eu criaria tudo separado, pois de fato sao duas entidades independentes de algo ancestral em comum, mesmo que por acaso tenham atributos similares.

1 curtida

Boa noite

Mas você não deixou de repetir código, pois criou dois métodos que têm uma parte grande repetida, a parte utilzada editar nome, telefone, email.

Eu excluí a minha resposta porque pensando bem as classes PessoaFisica e PessoaJuridica provavelmente seriam classes DTO ou Entity e não seria legal incorporar comportamentos. As duas classes ter alguns atributos repetidos é bem aceitável, e forçar reuso de código nesse nível a ponto de ter que usar herança pode não ser uma boa ideia. Além do mais herança foi pensada mais para polimorfismo e não reutilização de atributos e métodos.

1 curtida