i have created an object orientated Calculator without GUI.
i have provided only the most important parts of the code. I want to add another review question for those parts (especially: MathResult and Operands)
Interface Calculator
public interface Calculator {
MathResult<?> calculate(String operation);
}
Interface OperationParser
public interface OperationParser<T> {
boolean matches(String operation);
Operation<T> getOperation();
}
example-implementation: SimpleCalculator
public class SimpleCalculator implements Calculator {
private final List<OperationParser<?>> operationParsers = new ArrayList<>();
public SimpleCalculator(){
operationParsers.add(new SimpleInfixArithmeticOperationParser(MathContext.DECIMAL64));
operationParsers.add(new SimpleTrigonometricOperationParser());
}
@Override
public MathResult<?> calculate(String input) {
Optional<OperationParser<?>> parser = operationParsers.stream().filter(ip -> ip.matches(input)).findAny();
if(parser.isPresent()){
System.out.println("calculating "+parser.get().getOperation());
return parser.get().getOperation().calculate();
}else {
throw new IllegalArgumentException("no valid parser for input '"+input+"' found");
}
}
}
main Class
public class CalculatorApp {
public static void main(String[] args){
final Calculator calculator = new SimpleCalculator();
final Scanner scanner = new Scanner(System.in);
final Pattern exitPattern = Pattern.compile("[eE][xX][iI][tT]");
while (true) {
String line = scanner.nextLine();
if(exitPattern.matcher(line).matches()){
break;
}
try {
MathResult<?> result = calculator.calculate(line);
System.out.println("result: " + result);
}catch (Exception e){
System.out.println("error: " + e);
}
}
}
}