Несколько предложений.
Во-первых, я бы предложил при использовании boolean
в качестве условия для оператора if
избегать сравнения с true
и false
- в любом случае для boolean
существует только два состояния. Кроме того, поскольку существует только два состояния, вместо использования else if (false)
, достаточно else
:
if (condition == true)
{
// when condition is true
}
else if (condition == false)
{
// when condition is false
}
можно переписать как:
if (condition)
{
// when condition is true
}
else
{
// when condition is false
}
Во-вторых, вместо сравнения строковых литералов "add"
, "subtract"
и т. Д. Попробуйте использовать константы (final
переменные) или enum
с. Выполнение сравнения String
, такого как (operator == "add")
, выполняет проверку, чтобы определить, являются ли строковый литерал "add"
и переменная operator
ссылкой на один и тот же объект, а не значения одинаковы. Таким образом, при определенных обстоятельствах вы можете установить operator
на "add"
, но сравнение может не быть true
, потому что строковый литерал ссылается на отдельный объект. Простой обходной путь будет:
final String operatorAdd = "add";
// ...
if (input.equals("+"))
operator = operatorAdd;
// ...
if (operator == operatorAdd)
// ...
Теперь и присвоение operator
, и сравнение operator
оба ссылаются на константу operatorAdd
, поэтому для сравнения можно использовать ==
, а не equals()
метод.
В-третьих, поскольку это похоже на калькулятор, который на самом деле не требует двух операндов (например, operand1 + operand2
), а, скорее, одного операнда, который действует на сохраненное значение (то есть operand + currentValue
), он, вероятно, было бы проще иметь некоторую переменную, которая содержит текущее значение, и другую переменную, которая содержит оператор, и метод, который будет действовать в соответствии с текущим оператором и операндом. (Более или менее идея аккумуляторной машины или компьютера с 1 операндом.)
Основной метод работы будет:
- Установите
currentValue
.
- Установите оператора.
- Установите
operand
.
- Выполнить расчет.
- Установить
currentValue
на результат расчета.
- Установить оператор в пустое состояние.
Каждый шаг должен проверять, был ли выполнен предыдущий шаг - убедитесь, что указана операция (для operator
установлен допустимый оператор), затем следующее введенное значение становится operand
. Калькулятор похож на конечный автомат , где переход от одного шага к другому должен выполняться в определенном порядке, иначе он не перейдет к следующему шагу.
Итак, калькулятор может быть таким (псевдокод!):
// Initialize calculator (Step 1)
currentValue = 0;
operand = 0;
operator = operatorNone;
loop
{
operand = getOperand(); // Step 2
operator = getOperator(); // Step 3
// Step 4 and 5
if (operator == operatorAdd)
currentValue += operand;
if (operator == operatorSubtract)
currentValue -= operand;
// ...
// Step 6
operator = operatorNone;
}
Хотя в приведенном выше коде используется один цикл и он не работает как модель графического интерфейса пользователя на основе событий, но в нем должны быть указаны шаги, необходимые для запуска калькулятора.