package jp.mixi.assignment.layout.beg; public class CalcModel { @SuppressWarnings("unused") private static final String TAG = CalcModel.class.getSimpleName(); private double mTargetValue; private double mNowValue; private double base; private OPERATOR mOperator; /** 入力状態のステータス */ private STATUS status; public CalcModel() { init(); } private void init() { mNowValue = 0; mTargetValue = 0; mOperator = OPERATOR.NO_OPERATOR; status = STATUS.INITIAL; base = 1; } public double getNowValue() { return mNowValue; } public void putOperator(OPERATOR op) { if (op == OPERATOR.CLEAR) { init(); return; } if (status != STATUS.INPUT_OPERATION) { base = 1; mTargetValue = mOperator.call(mTargetValue, mNowValue); status = op.nextStatus(); mNowValue = 0; } mOperator = op; if (op == OPERATOR.EQUAL) { mNowValue = mTargetValue; } } public void putNumber(int num) { switch (status) { case RESULT: mOperator = OPERATOR.NO_OPERATOR; mTargetValue = 0; mNowValue = num; break; case INITIAL: case INPUT_OPERATION: mNowValue = num; break; case INPUT_NUMBER: if (base == 1) { mNowValue = mNowValue * 10 + num; } else { mNowValue = mNowValue + num * base; base /= 10; } break; } status = STATUS.INPUT_NUMBER; } public void putDot() { if (base == 1 && status == STATUS.INPUT_NUMBER) base = 0.1; } private enum STATUS { INPUT_NUMBER, INPUT_OPERATION, RESULT, INITIAL; } /** 演算子の定義 */ public enum OPERATOR { PLUS { @Override public double call(double val1, double val2) { return val1 + val2; } }, MINUS { @Override public double call(double val1, double val2) { return val1 - val2; } }, TIMES { @Override public double call(double val1, double val2) { return val1 * val2; } }, DIVIDE { @Override public double call(double val1, double val2) { return val1 / val2; } }, EQUAL { @Override public double call(double val1, double val2) { return val1; } @Override public STATUS nextStatus() { return STATUS.RESULT; } }, CLEAR { @Override public double call(double val1, double val2) { return 0; } @Override public STATUS nextStatus() { return STATUS.INITIAL; } }, NO_OPERATOR { @Override public double call(double val1, double val2) { return val2; } }; public STATUS nextStatus() { return STATUS.INPUT_OPERATION; } /** 定義に従った演算を実装 */ abstract public double call(double val1, double val2); } }