Есть ли способ сбросить переменную в классе и установить функцию для ее значения? - PullRequest
0 голосов
/ 06 марта 2019

Так что в основном я пытаюсь сделать калькулятор без контроля потока. У меня есть класс калькулятора, который имеет функции, которые будут вызываться в контроллере (он имеет все классы действий, такие как сложение, равно и т. Д., Которые соответствуют нажатию кнопки в графическом интерфейсе). У меня есть три переменные: displayvalue, LHS и RHS в классе калькулятора. Значение дисплея - это то, что пользователь вводит нажатием кнопки (функция выполняет математические операции и получает щелчки «1», «2», «3» в виде числа 123 и устанавливает его в значение дисплея). Я хочу, чтобы значение LHS было отображаемым значением до сброса отображаемого значения на 0,0 при добавлении. После сброса я хочу, чтобы RHS был новым вводом от нажатия кнопки пользователя. Есть способ сделать это? Это то, что я пытался до сих пор (но он не реагирует на действие добавления и продолжает увеличивать ввод (например: я нажимаю «1», «2» и «+» и «3», я получаю 123, как будто я никогда не нажимал "+")

class AdditionAction(calculator: Calculator) extends EventHandler[ActionEvent] {
  override def handle(event: ActionEvent): Unit = {
    calculator.LHS = calculator.displayValue //store current displayvalue
    calculator.reset() //reset displayvalue
    calculator.setUp("AdditionAction") //try to get the new displayvalue
    calculator.displayValue = calculator.LHS + calculator.RHS //perform addition
  }
}

Из класса калькулятора:

var displayValue = 0.0
var LHS: Double = displayValue
var RHS = 0.0

def setUp(input: String): Unit = {
    this.RHS = this.displayValue
    this.operation = input
  }

  def reset(): Unit ={
    this.displayValue = 0.0
  }

  def displayNumber(): Double = {
    displayValue
  }

1 Ответ

0 голосов
/ 06 марта 2019

Здесь есть две основные проблемы.

Во-первых, ваша функция обработчика событий не меняет значение displayValue. Если вы будете следовать логике вашего обработчика событий, вы увидите, что reset устанавливает displayValue на 0.0 и setUp копирует displayValue на RHS. Таким образом, RHS всегда равно 0.0, и вычисление просто возвращает исходное значение displayValue, которое было скопировано в LHS.

Во-вторых, вы используете displayValue для хранения как пользовательского ввода, так и результата. Поэтому, когда пользователь вводит еще одну цифру, ваш код предполагает, что displayValue является вводом пользователя, и просто добавляет цифру к номеру, а не начинает новый номер.

Чтобы избежать первой проблемы, было бы лучше сохранить состояние калькулятора в неизменяемой структуре и написать методы, которые генерируют новое состояние на основе старого. Это сделает логику намного легче следовать. Наличие изменяемых структур данных с такими методами, как reset и setUp, делает логику трудной для понимания и является довольно нестандартным способом выполнения действий.

Чтобы устранить вторую проблему, вам нужно отслеживать ввод и вывод отдельно или отслеживать состояние калькулятора, чтобы узнать, является ли дисплей вводом или выводом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...