From 69a954144b13a665d70674204a9b76088cf4ed1b Mon Sep 17 00:00:00 2001 From: Nikola Trubitsyn Date: Wed, 10 May 2017 17:38:34 +0300 Subject: [PATCH] Polymorphic calculator operations --- .../calculator/CalculatorImpl.java | 60 ++++--------------- .../calculator/operation/DivideOperation.java | 20 +++++++ .../calculator/operation/MinusOperation.java | 15 +++++ .../calculator/operation/ModuloOperation.java | 19 ++++++ .../operation/MultiplyOperation.java | 15 +++++ .../operation/OperationFactory.java | 31 ++++++++++ .../calculator/operation/PlusOperation.java | 16 +++++ .../calculator/operation/PowerOperation.java | 20 +++++++ .../calculator/operation/RootOperation.java | 16 +++++ .../operation/base/BinaryOperation.java | 11 ++++ .../calculator/operation/base/Operation.java | 5 ++ .../operation/base/UnaryOperation.java | 10 ++++ 12 files changed, 189 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/DivideOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/MinusOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/ModuloOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/MultiplyOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/OperationFactory.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/PlusOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/PowerOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/RootOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/base/BinaryOperation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/base/Operation.java create mode 100644 app/src/main/java/com/simplemobiletools/calculator/operation/base/UnaryOperation.java diff --git a/app/src/main/java/com/simplemobiletools/calculator/CalculatorImpl.java b/app/src/main/java/com/simplemobiletools/calculator/CalculatorImpl.java index a1f99162..547df3a6 100644 --- a/app/src/main/java/com/simplemobiletools/calculator/CalculatorImpl.java +++ b/app/src/main/java/com/simplemobiletools/calculator/CalculatorImpl.java @@ -1,5 +1,8 @@ package com.simplemobiletools.calculator; +import com.simplemobiletools.calculator.operation.OperationFactory; +import com.simplemobiletools.calculator.operation.base.Operation; + public class CalculatorImpl { private String mDisplayedValue; private String mDisplayedFormula; @@ -110,60 +113,19 @@ public class CalculatorImpl { } public void calculateResult() { - if (!mIsFirstOperation) + if (!mIsFirstOperation) { updateFormula(); - - switch (mLastOperation) { - case Constants.PLUS: - updateResult(mBaseValue + mSecondValue); - break; - case Constants.MINUS: - updateResult(mBaseValue - mSecondValue); - break; - case Constants.MULTIPLY: - updateResult(mBaseValue * mSecondValue); - break; - case Constants.DIVIDE: - divideNumbers(); - break; - case Constants.MODULO: - moduloNumbers(); - break; - case Constants.POWER: - powerNumbers(); - break; - case Constants.ROOT: - updateResult(Math.sqrt(mBaseValue)); - break; - default: - break; } + + Operation operation = OperationFactory.forId(mLastOperation, mBaseValue, mSecondValue); + + if (operation != null) { + updateResult(operation.getResult()); + } + mIsFirstOperation = false; } - private void divideNumbers() { - double resultValue = 0; - if (mSecondValue != 0) - resultValue = mBaseValue / mSecondValue; - - updateResult(resultValue); - } - - private void moduloNumbers() { - double resultValue = 0; - if (mSecondValue != 0) - resultValue = mBaseValue % mSecondValue; - - updateResult(resultValue); - } - - private void powerNumbers() { - double resultValue = Math.pow(mBaseValue, mSecondValue); - if (Double.isInfinite(resultValue) || Double.isNaN(resultValue)) - resultValue = 0; - updateResult(resultValue); - } - public void handleOperation(String operation) { if (mLastKey.equals(Constants.DIGIT)) handleResult(); diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/DivideOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/DivideOperation.java new file mode 100644 index 00000000..47e32fa9 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/DivideOperation.java @@ -0,0 +1,20 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.BinaryOperation; +import com.simplemobiletools.calculator.operation.base.Operation; + +public class DivideOperation extends BinaryOperation implements Operation { + + public DivideOperation(double baseValue, double secondValue) { + super(baseValue, secondValue); + } + + @Override + public double getResult() { + double result = 0; + if (secondValue != 0) { + result = baseValue / secondValue; + } + return result; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/MinusOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/MinusOperation.java new file mode 100644 index 00000000..3fb22bb3 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/MinusOperation.java @@ -0,0 +1,15 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.BinaryOperation; +import com.simplemobiletools.calculator.operation.base.Operation; + +public class MinusOperation extends BinaryOperation implements Operation { + protected MinusOperation(double baseValue, double secondValue) { + super(baseValue, secondValue); + } + + @Override + public double getResult() { + return baseValue - secondValue; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/ModuloOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/ModuloOperation.java new file mode 100644 index 00000000..f31741a2 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/ModuloOperation.java @@ -0,0 +1,19 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.BinaryOperation; +import com.simplemobiletools.calculator.operation.base.Operation; + +public class ModuloOperation extends BinaryOperation implements Operation { + protected ModuloOperation(double baseValue, double secondValue) { + super(baseValue, secondValue); + } + + @Override + public double getResult() { + double result = 0; + if (secondValue != 0) { + result = baseValue % secondValue; + } + return result; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/MultiplyOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/MultiplyOperation.java new file mode 100644 index 00000000..0db6aa60 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/MultiplyOperation.java @@ -0,0 +1,15 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.BinaryOperation; +import com.simplemobiletools.calculator.operation.base.Operation; + +public class MultiplyOperation extends BinaryOperation implements Operation { + protected MultiplyOperation(double baseValue, double secondValue) { + super(baseValue, secondValue); + } + + @Override + public double getResult() { + return baseValue * secondValue; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/OperationFactory.java b/app/src/main/java/com/simplemobiletools/calculator/operation/OperationFactory.java new file mode 100644 index 00000000..35fca78a --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/OperationFactory.java @@ -0,0 +1,31 @@ +package com.simplemobiletools.calculator.operation; + +import android.support.annotation.Nullable; + +import com.simplemobiletools.calculator.Constants; +import com.simplemobiletools.calculator.operation.base.Operation; + +public class OperationFactory { + + @Nullable + public static Operation forId(String id, double baseValue, double secondValue) { + switch (id) { + case Constants.PLUS: + return new PlusOperation(baseValue, secondValue); + case Constants.MINUS: + return new MinusOperation(baseValue, secondValue); + case Constants.DIVIDE: + return new DivideOperation(baseValue, secondValue); + case Constants.MULTIPLY: + return new MultiplyOperation(baseValue, secondValue); + case Constants.MODULO: + return new ModuloOperation(baseValue, secondValue); + case Constants.POWER: + return new PowerOperation(baseValue, secondValue); + case Constants.ROOT: + return new RootOperation(baseValue); + default: + return null; + } + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/PlusOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/PlusOperation.java new file mode 100644 index 00000000..6c5e16c4 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/PlusOperation.java @@ -0,0 +1,16 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.BinaryOperation; +import com.simplemobiletools.calculator.operation.base.Operation; + +public class PlusOperation extends BinaryOperation implements Operation { + + protected PlusOperation(double baseValue, double secondValue) { + super(baseValue, secondValue); + } + + @Override + public double getResult() { + return baseValue + secondValue; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/PowerOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/PowerOperation.java new file mode 100644 index 00000000..54d91796 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/PowerOperation.java @@ -0,0 +1,20 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.BinaryOperation; +import com.simplemobiletools.calculator.operation.base.Operation; +import com.simplemobiletools.calculator.operation.base.UnaryOperation; + +public class PowerOperation extends BinaryOperation implements Operation { + + protected PowerOperation(double baseValue, double secondValue) { + super(baseValue, secondValue); + } + + @Override + public double getResult() { + double result = Math.pow(baseValue, secondValue); + if (Double.isInfinite(result) || Double.isNaN(result)) + result = 0; + return result; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/RootOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/RootOperation.java new file mode 100644 index 00000000..d4a02f56 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/RootOperation.java @@ -0,0 +1,16 @@ +package com.simplemobiletools.calculator.operation; + +import com.simplemobiletools.calculator.operation.base.Operation; +import com.simplemobiletools.calculator.operation.base.UnaryOperation; + +public class RootOperation extends UnaryOperation implements Operation { + + protected RootOperation(double value) { + super(value); + } + + @Override + public double getResult() { + return Math.sqrt(value); + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/base/BinaryOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/base/BinaryOperation.java new file mode 100644 index 00000000..9252df4e --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/base/BinaryOperation.java @@ -0,0 +1,11 @@ +package com.simplemobiletools.calculator.operation.base; + +public class BinaryOperation { + protected double baseValue; + protected double secondValue; + + protected BinaryOperation(double baseValue, double secondValue) { + this.baseValue = baseValue; + this.secondValue = secondValue; + } +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/base/Operation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/base/Operation.java new file mode 100644 index 00000000..2e7b887c --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/base/Operation.java @@ -0,0 +1,5 @@ +package com.simplemobiletools.calculator.operation.base; + +public interface Operation { + double getResult(); +} diff --git a/app/src/main/java/com/simplemobiletools/calculator/operation/base/UnaryOperation.java b/app/src/main/java/com/simplemobiletools/calculator/operation/base/UnaryOperation.java new file mode 100644 index 00000000..da535df1 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calculator/operation/base/UnaryOperation.java @@ -0,0 +1,10 @@ +package com.simplemobiletools.calculator.operation.base; + +public class UnaryOperation { + + protected double value; + + protected UnaryOperation(double value) { + this.value = value; + } +}