1
resposta

Dúvida: Evitar Magic Numbers e programação hardcoded

Bom dia a todos. Tenho uma classe que tem dois métodos. No primeiro método, baseado no TipoResponsavel do objeto Mandato, eu defino o nível da responsabilidade(cada Nível pode desempenhar algumas funções).

No segundo método, eu faço uma verificação, para o sistema de acordo com alguns tipos de responsável tem prazo para se cadastrar sob penalidade de multa, já outros tipos de responsável são isentos de prazo.

O código abaixo funciona, mas estou achando bem ruimzinho, ele não está orientado a objetos, pois estou fazendo tudo hardcoded, com muitos ifs e fazendo comparações diretamente com os ids dos objetos. Pelos cursos da Alura acredito que um padrão que eu poderia usar era Strategy, mas não estou conseguindo vislumbrar como aplicar isso neste meu código(As classes envolvidas são entidades JPA). Alguma sugestão de como proceder? Agradeço.

public class UtilResponsabilidade {


    public Responsabilidade AtribuirNivelResponsabilidade(Mandato mandato, Responsabilidade responsabilidade){

//nivel 1 - ente(visualiza tudo)
//nivel 2 - poder
//nivel 3 - unidade
//nivel 4 - consulta

        if (mandato.getTipoResponsavel().getTipoResponsavelId() == 1){ 
// Chefe dos Poderes 
            responsabilidade.setNivel(new Nivel(1));
        }else if (mandato.getTipoResponsavel().getTipoResponsavelId() == 2){
 // Titular de Secretaria de Governo
            responsabilidade.setNivel((new Nivel(1));
        }else if(mandato.getTipoResponsavel().getTipoResponsavelId() == 6){
 // Contador
            responsabilidade.setNivel((new Nivel(2));
        }else if(mandato.getTipoResponsavel().getTipoResponsavelId() == 7){ 
// Agente Responsável por Procedimento Licitatório
            responsabilidade.setNivel((new Nivel(1));
        }else if(mandato.getTipoResponsavel().getTipoResponsavelId() == 34){
 // Procurador
            responsabilidade.setNivel((new Nivel(1));
        }else if(mandato.getTipoResponsavel().getTipoResponsavelId() == 35){ 
// Assessores Jurídicos e/ou Advogados
            responsabilidade.setNivel((new Nivel(3));
        }else if(mandato.getTipoResponsavel().getTipoResponsavelId() == 38){ 
// Superintendente
            responsabilidade.setNivel((new Nivel(1));
        }else if(mandato.getTipoResponsavel().getTipoResponsavelId() == 47){
 // Usuário SAAE
            responsabilidade.setNivel((new Nivel(1));
        }else {
            responsabilidade.setNivel((new Nivel(4));
        }

        return responsabilidade;
    }




    public Boolean isCadastroForaPrazo(Date hoje, Mandato mandato){

        if((((hoje.getTime() - mandato.getDataInicio().getTime()) / 1000 / 60 / 60 / 24) > 60)
                && (mandato.getTipoResponsavel().getTipoResponsavelId() != 45) // Usuário Sap
                && (mandato.getTipoResponsavel().getTipoResponsavelId() != 37) // Usuário Scon
                && (mandato.getTipoResponsavel().getTipoResponsavelId() != 47) // Usuário SAAE
                && (mandato.getTipoResponsavel().getTipoResponsavelId() != 53)//USUARIO CESMA
                && (mandato.getTipoResponsavel().getTipoResponsavelId() != 52)){ // Usuário SAP
            return true;
        }
        return false;
    }

}
1 resposta

Fala ai Ricardo, tudo bem ?

Bem bacana essa sua preocupação em manter o código limpo :D

O que você disse é bem importante, Strategy resolveria bastante esse caso.

Outro ponto importante é remover esses numeros mágicos, procura deixar ou em constantes, ou também num enum - dessa forma você consegue deixar bem claro o que significa.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software