somekind napisał(a):
No i w przypadku wniosku urlopowego, który ma tylko 4 stany, to pewnie prawda, ale są przypadki, w których zakończenie kolejnego etapu powoduje pojawienie się nowych danych.
Poza tym, to problemem na ogół nie są dane, tylko zarządzanie przechodzeniem po grafie stanów oraz weryfikacja legalności operacji dla danego stanu.
Co do komplikacji, to liczba kombinacji rośnie mocno nieliniowo, dla 20 stanów masz ich 20 razy więcej niż dla 4.
Na początek złożoność maszyny stanów. Jeżeli masz 30 możliwych stanów i 400 możliwych przejść pomiędzy tymi stanami, wynika to z wymagań biznesowych, to tak czy inaczej jakoś tę złożoność musisz zakodować. Możesz to zrobić albo za pomocą 30 klas reprezentujących stany, w których znajdzie się łącznie 400 metod, albo pojedynczej klasy reprezentującej stateful object (np. ten wniosek urlopowy), 30 wartości enuma + 400 definicji [initial state, event, result state]
. Kodu mniej - więcej tyle samo.
Maksymalnie prosty diagram stanów jakiegoś wyłącznika:
Przy tworzeniu klasy per stan miałbyś coś takiego:
open abstract class Switch(val SwitchId){
// nie wiemy, czy click będzie w każdym możliwym stanie, nie można wyciągnąć ten metody do klasy nadrzędnej
}
class SwitchOn: Switch{
clickOff(){
return SwitchOff()
}
}
class SwitchOff: Switch{
clickOn(){
return SwitchOn()
}
}
Potrzebujesz do tego jakiejś serializacji i deserializacji:
fun saveSwitch(switch: Switch){...}
fun findSwitch(id: SwitchId): Switch {...}
I masz pierwszy problem już na poziomie interface'u bazy danych:
fun userClickedSwith(switchId: SwitchId){
val switch = findSwitch(switchId)
if(switch is SwitchOn) switch.clickOff
if(switch is SwitchOff) switch.clickOff
saveSwitch(switch)
}
Na warstwie persystencji też nie jest łatwo, bo zakładając tabela na klasę, musisz przeszukać 2 tabele zamiast jednej.