Ojej, to nie jest tak skomplikowane, jak się wydaje. Kod maszynowy stanu jest bardzo prosty i krótki.
Zapisz stan w zmiennej, powiedzmy myState.
Maszyna stan będzie instrukcją przełącznika, rozgałęziającą się na wartość zmiennej myState w celu wykonania kodu dla każdego stanu.
Kod będzie pełen liniami takimi jak ten:
myState = newState;
Aby egzekwować wymagania zmiana stanu, trzeba dodać trochę metodę o nazwie zamiast, jak to
void DoSafeStateTransition(int newState)
{
// check myState -. newState is not forbidden
// lots of ways to do this
// perhaps nested switch statement
switch(myState) {
…
case X: switch(newState)
case A: case B: case Z: HorribleError(newState);
break;
...
}
// check that newState is not undetermined
switch(newState) {
// all the determined states
case A: case B: case C … case Z: myState = newState; break;
default: HorribleError(newState);
}
}
void HorribleError(int newState)
{ printf("Attempt to go from %d to %d - disallowed\n",
myState, newState);
exit(1);
}
I sugerują, że to proste i wystarczająco krótkie, aby inspekcja przebiegła lepiej niż testowanie jednostkowe - na pewno będzie dużo szybciej!
Punktem, według mnie, testów jednostkowych jest to, że kod testowy jest prostszy niż testowany kod, więc można go łatwiej sprawdzić pod kątem poprawności, a następnie użyć go do przetestowania skomplikowanego kodu. Często łatwiej jest sprawdzić kod maszynowy stanu niż kod testu stanu komputera. Nie ma sensu zgłaszanie 100-procentowego testu jednostkowego, jeśli nie masz pojęcia, czy testy jednostkowe są poprawne.
Innymi słowy: kodowanie maszyny stanowej jest łatwe, a zaprojektowanie prawidłowego jest trudne. Testy jednostkowe podpowiedzą tylko, czy poprawnie zakodowałeś projekt, a nie czy projekt był poprawny.
wyszukiwania dla „formalnego zatwierdzania machiny państwowej” – bobah