Skip to main content
Tweeted twitter.com/StackCodeReview/status/907731372244160512
edited tags
Link
200_success
  • 145.7k
  • 22
  • 191
  • 481
Source Link
Agnieszka
  • 145
  • 2
  • 2
  • 7

Simple object oriented console calculator

I'd like to learn OOP. Could someone check my code and tell me how to improve it?

package com.company;

import java.util.InputMismatchException;
import java.util.Scanner;

public class CalculatorApp {
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        System.out.println("Write two numbers and +, -, * or / sign");
        char operator = 0;
        double firstNum = 0;
        double secondNum = 0;
        try {
            firstNum = scanner.nextDouble();
            secondNum = scanner.nextDouble();
            operator = scanner.next().charAt(0);
        } catch (InputMismatchException ime) {
            System.out.println("invalid input");
        } finally {
            if (operator != '+' & operator != '-' & operator != '*' & operator != '/') {
                throw new InputMismatchException();
            }
            Calculator calculator = new Calculator(firstNum, secondNum,    operator);
            System.out.println(calculator.makeCalculation());
        }
    }
}

Calculator class:

package com.company;

import java.util.HashMap;
import java.util.Map;

public class Calculator {
    private char operation;
    private double operand1;
    private double operand2;
    private Map<Character, Operation> operationMap = new HashMap<>();

    public Calculator(double operand1, double operand2, char operation) {
        this.operand1 = operand1;
        this.operand2 = operand2;
        this.operation = operation;

        operationMap.put('+', new Addition());
        operationMap.put('-', new Subtraction());
        operationMap.put('*', new Multiplication());
        operationMap.put('/', new Division());
    }

    public double makeCalculation() {
        Operation operationMapValue = null;
        if (operationMap.containsKey(operation)) {
            operationMapValue = operationMap.get(operation);
            System.out.println(operationMap.get(operation));
        } else {
            System.out.println("Invalid sign");
        }
        return operationMapValue.calculateResult(operand1, operand2);
    }
}

Operation interface:

package com.company;

public interface Operation {
    double calculateResult(double left, double right);
}

One of implementing classes:

package com.company;

public class Addition implements Operation {
    @Override
    public double calculateResult(double left, double right) {
        return left + right;
    }
}

And Tests:

package com.company;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {
    Calculator calc = new Calculator(6.0, 2.0, '+');

    @Test
    void addsTwoNumbers() {
        assertEquals(8.0, calc.makeCalculation());
    }

    Calculator calc2 = new Calculator(6.0, 2.0, '-');
    @Test
    void subtractsTwoNumbers() {
        assertEquals(4.0, calc2.makeCalculation());
    }

    Calculator calc3 = new Calculator(6.0, 2.0, '*');
    @Test
    void multipliesTwoNumbers() {
        assertEquals(12.0, calc3.makeCalculation());
    }

    Calculator calc4 = new Calculator(6.0, 2.0, '/');
    @Test
    void dividesTwoNumbers() {
        assertEquals(3.0, calc4.makeCalculation());
    }
}