Utilizarea "State Machine"-ilor (SM) este larg rapandita in programare. Un SM este un automat de stari programat sa execute anumite functii in corelatie cu anumite evenimente si semnale externe.
Decizii de design :
– Reprezentarea evenimentelor
– Reprezentarea starilor
– Reprezentarea tranzitiilor
– Distribuirea evenimentelor catre StateMachine
Metode si modele de creere a unui SM :
– Switch-uri imbricate
– Tabel de stari
– OO State Design Pattern
– Abordare mixta
Cereintele unui SM:
– Intretinerea simpla
– Utilizarea memoriei minimala
– Eficienta
Reprezentarea comuna a unui SM:
Metoda Switch-urilor imbricate
- Starile si evenimentele sunt reprezentate de enumeratii - Cel puțin două niveluri ale declarațiilor de comutare; una pentru expedierea statului, celălalt pentru selectarea semnalului.
- Acțiuni de tranziție sunt puse în aplicare în declarația de comutare a selectarii semnalului
Pro:
– Simpla și pe scară largă instituit
– Amprenta de memorie mică (o singură variabilă care conține starea)
Contra:
– O posibilitate redusă de refolosire a codului
– Distribuirea liniara in timp a evenimentelor si a semnalelor
Exemplu:
Decizii de design :
– Reprezentarea evenimentelor
– Reprezentarea starilor
– Reprezentarea tranzitiilor
– Distribuirea evenimentelor catre StateMachine
Metode si modele de creere a unui SM :
– Switch-uri imbricate
– Tabel de stari
– OO State Design Pattern
– Abordare mixta
Cereintele unui SM:
– Intretinerea simpla
– Utilizarea memoriei minimala
– Eficienta
Reprezentarea comuna a unui SM:
Metoda Switch-urilor imbricate
- Starile si evenimentele sunt reprezentate de enumeratii - Cel puțin două niveluri ale declarațiilor de comutare; una pentru expedierea statului, celălalt pentru selectarea semnalului.
- Acțiuni de tranziție sunt puse în aplicare în declarația de comutare a selectarii semnalului
Pro:
– Simpla și pe scară largă instituit
– Amprenta de memorie mică (o singură variabilă care conține starea)
Contra:
– O posibilitate redusă de refolosire a codului
– Distribuirea liniara in timp a evenimentelor si a semnalelor
Exemplu:
typedef enum
{
SIG_1, /* signal 1 */
SIG_2 /* signal 2 */
} signal_t;
typedef enum
{
STATE_1, /* state 1 */
STATE_2 /* state 2 */
} state_t;
state_t cur_state;
void init(void)
{
cur_state = STATE_1;
}
void tran(state_t target_state)
{
cur_state=target_state;
}
dispatch(signal_t signal)
{
switch(cur_state)
{
case STATE_1:
switch(signal)
{
case SIG_1:
/* trans action */
tran(STATE_2);
break;
}
break;
case(STATE_2):
switch(signal)
{
case SIG_1:
/* trans action */
break;
case SIG_2:
/* trans action */
tran(STATE_1);
break;
}
break;
}
}