Я создаю конечный автомат в Котлине для управления состоянием BLE. Я знаю, что в Tinder есть библиотека DSL для FSM, но я хочу написать что-нибудь самостоятельно.
Вот что у меня есть до сих пор.
Состояние и действия FSM представлены с помощью запечатанных классов. Например, устройство BLE может находиться в состоянии Подключено или Отключено, каждое из которых, в свою очередь, может иметь подсостояния (состояние Подключено может означает, что он находится в одном из ReadingCharacteristic, WritingCharacteristic, SubscribeingToCharacteristic или просто Idle)
sealed class BleState {
sealed class Connected : BleState() {
object Idle : Connected()
object ReadingCharacteristic : Connected()
object WritingCharacteristic : Connected()
object SubscribingToCharacteristic : Connected()
}
object Error: BleState()
}
Действия также представлены с помощью запечатанных классов.
sealed class BleOperation {
data class Connect(val bleDevice: BleDevice) : BleOperation()
object ConnectionCompleted : BleOperation()
.
.
data class Disconnect(val bleDevice: BleDevice) : BleOperation()
object ErrorOccurred : BleOperation()
}
Мне нужен способ представления переходов. Должно ли это быть что-то вроде таблицы/двухмерного массива? Должна ли это быть карта ‹State, List(Events)›, где каждое состояние будет перечислять все возможные события, которые оно может принять? Или я могу моделировать Transition как класс с такими свойствами, как currentState, action и newState? Мне нужно убедиться, что переходы действительны.