Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use IF or Polymorphism?

I have a question about Java. I've been working with Java for less than a year, and I'm starting to have interesting doubts about design patterns:

For example, I want to improve my code with Object-Oriented (OO) principles to make it cleaner, but it raised a question: won't I increase the processing time?

In the code below:

import java.util.ArrayList;
import java.util.List;


public class EscritorioContabilidade {
    
    //metodo para recuperar a informacao salarial utilizando os IF´s da pior maneira....rsrsr
    public double getSalarioFuncionario(String tipoFuncionario){
        double salario = -1;
        if("gerente".equals(tipoFuncionario)){
            salario = 1000;
        }
        else if("balconista".equals(tipoFuncionario)){
            salario = 900;
        }
        else if("faixineiro".equals(tipoFuncionario)){
            salario = 550;
        }
        return salario;
    }
    
    //metodo para recuperar a informacao salarial utilizando os IF´s. Nao melhoramos muito
    public double getSalarioFuncionario(Object funcionario){
        double salario = -1;
        if(funcionario instanceof Gerente){
            salario = 1000;
        }
        else if(funcionario instanceof Balconista){
            salario = 900;
        }
        else if(funcionario instanceof Faixineiro){
            salario = 550;
        }
        return salario;
    }
    
    //metodo para recuperar a informacao salarial utilizando polimorfismo. Agora sim!
    public double getSalarioFuncionario(Funcionario funcionario){
        return funcionario.informarSalario();
    }
    
    public static void main(String [] asdf){
        EscritorioContabilidade escritorioContabilidade = new EscritorioContabilidade();
        double folhaPagamento = 0;
        
        List<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
        
        //adicionando os funcionarios 
        listaFuncionar
io.add(new Gerente());
        listaFuncionario.add(new Balconista());
        listaFuncionario.add(new Faixineiro());
        
        //usando o polimorfismo para determinar a folha de pagamento
        for (Funcionario funcionario : listaFuncionario) {
            folhaPagamento += escritorioContabilidade.getSalarioFuncionario(funcionario);
        }
        System.out.println("folha de pagamento: "+folhaPagamento);
        
        //agora vamos usar um dos metodos que utilizam os IFs e voces podem ver a clareza em ambos os trechos de codigo
        folhaPagamento = 0;
        folhaPagamento +=  escritorioContabilidade.getSalarioFuncionario("gerente");
        folhaPagamento +=  escritorioContabilidade.getSalarioFuncionario("balconista");
        folhaPagamento +=  escritorioContabilidade.getSalarioFuncionario("faixineiro");
        
        System.out.println("folha de pagamento: "+folhaPagamento);
    }
}


public abstract class Funcionario {
    public abstract double informarSalario();
}


public class Gerente extends Funcionario {

    @Override
    public double informarSalario() {
        return 1000;
    }

}

class Balconista extends Funcionario{

    @Override
    public double informarSalario() {
        return 900;
    }
    
}

class Faixineiro extends Funcionario{

    @Override
    public double informarSalario() {
        return 550;
    }
    
}

In this code, if I use polymorphism, my code certainly becomes more elegant. However, if I use if statements, wouldn't it have better performance because it doesn't create memory pointers and such?

I hope to clarify a question about Java and design patterns.

like image 762
Vinícius Alves Avatar asked Sep 08 '26 06:09

Vinícius Alves


1 Answers

The "memory and performance" differences are negligible, approaching zero.

You're always better to have several classes that each have constant behaviour than one "Swiss army knife" class that has variable behaviour.

Your "typed" solution is easier to read, understand, test and extend - that's the most important aspect to consider.

like image 151
Bohemian Avatar answered Sep 09 '26 18:09

Bohemian