Bom dia galera, estou fazendo uma calculadora apenas para exercitar LP e gostaria de uma opinião sobre como melhorar este projeto.
Tenho esta topologia e gostaria de diminuir a responsabilidade da minha classe CalculadoraPrincipal. Eu criei uma interface chamada Operacao que tem apenas um método calcula, toda classe que desejar realizar uma operação matemática deve assinar este contrato e saber calcular os valor recebidos como parâmetro. A classe CalculadoraPrincipal cria o fluxo de entrada/saída de dados e chama o método calcula dependendo da escolha do usuário.
Um outro problema é que meu código possui muitos Ifs e sempre que precisar adicionar uma nova operação como por exemplo raiz quadrada, vou precisar adicionar um novo If.
Se alguém souber de algum Design Pattern apropriado para este problema, ou alguma outra ideia, ajudaria muito!
package br.com.jorge.calculadora;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Scanner;
public class CalculadoraPrincipal {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner scan = new Scanner(System.in);
boolean continua = true;
FileWriter fw = new FileWriter("numeroscalculados.txt");
while (continua) {
System.out.println("1 - Soma \n2 - Subtração \n3 - Multiplicação \n4 - Divisão.");
System.out.println("Qual operação deseja efetuar?");
int operacao = scan.nextInt();
System.out.println("Digite o primeiro valor: ");
BigDecimal valor1 = scan.nextBigDecimal();
System.out.println("Digite o segundo valor: ");
BigDecimal valor2 = scan.nextBigDecimal();
if (operacao == 1) {
Operacao soma = new Soma();
System.out.println(soma.calcula(valor1, valor2));
fw.write("Soma de " + valor1 + " + " + valor2 + "\n");
}
if (operacao == 2) {
Operacao subtracao = new Subtracao();
System.out.println(subtracao.calcula(valor1, valor2));
fw.write("Subtração de " + valor1 + " - " + valor2 + "\n");
}
if (operacao == 3) {
Operacao multiplica = new Multiplica();
System.out.println(multiplica.calcula(valor1, valor2));
fw.write("Multiplicação de " + valor1 + " * " + valor2 + "\n");
}
if (operacao == 4) {
Operacao divisao = new Divide();
System.out.println(divisao.calcula(valor1, valor2));
fw.write("Divisão de " + valor1 + " / " + valor2 + "\n");
}
System.out.println("Deseja continuar a operação? \n1 - Sim \n2 - Não");
int reiniciar = scan.nextInt();
if (reiniciar == 2) {
continua = false;
scan.close();
fw.close();
}
System.out.println("Obrigado por utilizar a calculadora!");
}
}
}
package br.com.jorge.calculadora;
import java.math.BigDecimal;
public interface Operacao {
public BigDecimal calcula(BigDecimal valor1, BigDecimal valor2);
}
package br.com.jorge.calculadora;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Divide implements Operacao {
public BigDecimal calcula(BigDecimal valor1, BigDecimal valor2) {
return BigDecimal.valueOf(valor1.doubleValue() / valor2.doubleValue()).setScale(2, RoundingMode.HALF_UP);
}
}
package br.com.jorge.calculadora;
import java.math.BigDecimal;
public class Multiplica implements Operacao {
public BigDecimal calcula(BigDecimal valor1, BigDecimal valor2) {
return valor1.multiply(valor2);
}
}
package br.com.jorge.calculadora;
import java.math.BigDecimal;
public class Soma implements Operacao {
public BigDecimal calcula(BigDecimal valor1, BigDecimal valor2) {
return valor1.add(valor2);
}
}
package br.com.jorge.calculadora;
import java.math.BigDecimal;
public class Subtracao implements Operacao {
public BigDecimal calcula(BigDecimal valor1, BigDecimal valor2) {
return valor1.subtract(valor2);
}
}