Улучшение State Machine реализовано в scala - PullRequest
0 голосов
/ 07 января 2020

Я работаю над реализацией конечного автомата в scala.

Оригинальная версия написана на python, поэтому в коде много предложений if / else.

Сам конечный автомат имеет больше значений, чем состояние. И само состояние зависит от этих значений.

Состояния объекта будут сохраняться в базе данных каждый раз при изменении состояния.

Для обновления состояния конечный автомат имеет обновление метод, чтобы сделать переходы.

Пример кода очень прост c, мой вопрос касается вложения моего оператора if в подходе сопоставления с образцом. Есть ли в scala более чистый способ добиться этого? Я использовал неизменный способ его реализации.

trait State
case object Initial extends State
case object State1 extends State
case object State2 extends State        

case class StateMachine (
                              id: Int,
                              currentState: State = Initial,
                              previousState: Option[State] = None,
                              value1: Int = 0,
                              value2: Int = 0,
                              value3: Int = 0
                            ) {



    def update(val1: Int, val2: Int, val3: Int): StateMachine = {

    val newStateMachine: StateMachine = (val1, val2) match {

      case (1, 1 ) => {

        val tempVal3 = val1 + val2

        if (val3 != 0 && val3 <= 100) {
          this.copy(currentState = State1, value1 = val1, value2 = val2, value3 = val3)
        } else if (val3 > 100) {
          this.copy(currentState = State2,value1 = val1, value2 = val2, value3 = val3 - tempVal3)
        }
        else {
          this.copy(value3 = tempVal3)
        }
      }

      case (2, _) if (val3 != 0 && val3 <= 100) => {
        if (val3 != 0 && val3 <= 50) {
          this.copy(currentState = State1, value1 = val1, value2 = val2, value3 = val3)
        }
        else {
          this.copy(value3 = 0)
        }
      }

      case _ => this
    }

    newStateMachine
  }
}
...