Я работаю над реализацией конечного автомата в 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
}
}