Merge pull request #26 from trubitsyn/master

Polymorphic calculator operations
This commit is contained in:
Tibor Kaputa
2017-05-10 18:20:45 +02:00
committed by GitHub
12 changed files with 189 additions and 49 deletions

View File

@@ -1,5 +1,8 @@
package com.simplemobiletools.calculator; package com.simplemobiletools.calculator;
import com.simplemobiletools.calculator.operation.OperationFactory;
import com.simplemobiletools.calculator.operation.base.Operation;
public class CalculatorImpl { public class CalculatorImpl {
private String mDisplayedValue; private String mDisplayedValue;
private String mDisplayedFormula; private String mDisplayedFormula;
@@ -110,60 +113,19 @@ public class CalculatorImpl {
} }
public void calculateResult() { public void calculateResult() {
if (!mIsFirstOperation) if (!mIsFirstOperation) {
updateFormula(); 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; 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) { public void handleOperation(String operation) {
if (mLastKey.equals(Constants.DIGIT)) if (mLastKey.equals(Constants.DIGIT))
handleResult(); handleResult();

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,5 @@
package com.simplemobiletools.calculator.operation.base;
public interface Operation {
double getResult();
}

View File

@@ -0,0 +1,10 @@
package com.simplemobiletools.calculator.operation.base;
public class UnaryOperation {
protected double value;
protected UnaryOperation(double value) {
this.value = value;
}
}