Aggiungendo segmento di scelta

Spesso nelle macchine a stati, è necessario eseguire una transizione di stato solo quando una condizione specifica (chiamata condizione di guardia) viene valutata TRUE in fase di esecuzione. Inoltre, molto spesso, è necessario passare a stati diversi, a seconda dell’esito di alcune condizioni di guardia valutate in fase di esecuzione.

L’UML fornisce un costrutto speciale, chiamato “choice pseudostate”, che è possibile utilizzare in tali situazioni. Uno “pseudostato di scelta” consente di dividere una transizione in più percorsi in uscita, ognuno con la propria condizione di guardia.

Nota È utile pensare allo pseudostato di scelta, come quello mostrato nel pannello (B) del diagramma sopra, come l’istruzione compoundif (guard1()) {...} else if (guard2()) {...}(questo è infatti il modo in cui il generatore di codice QM™ implementa i segmenti di scelta). Attenzione Perché le guardie portano aIFs eELSEs nel codice, l’uso eccessivo di esse porta al codice “spaghetti” e sconfigge lo scopo di utilizzare le macchine a stati in primo luogo. Per questo motivo le guardie dovrebbero essere usate con giudizio.

Nella maggior parte degli strumenti UML, il processo di disegno dei segmenti di scelta consiste nell’aggiungere prima uno “pseudostato di scelta” (diamante) e quindi collegare un segmento di transizione in uscita con una guardia. In QM™ questo processo è semplificato, perché la macchina degli strumenti a stati contiene lo strumento Segmento di scelta pronto all’uso, che combina uno “pseudostato di scelta” con un segmento di transizione collegato in modo permanente ad esso.

Nota Il segmento di scelta è l’unico modo in QM™ per collegare una condizione di protezione a una transizione, come illustrato nel pannello (A) del diagramma sopra. Ma il segmento QM™ Choice è più potente delle semplici protezioni sulle transizioni, come spiegato nelle sezioni seguenti. Nota Per aggiungere un segmento di scelta, è necessario innanzitutto creare e mostrare un diagramma di stato. Inoltre, la macchina a stati deve avere almeno una transizione interna (terminata con) o un segmento di scelta (). Infine, per aggiungere, spostare, ridimensionare o modificare segmenti di scelta, il diagramma Macchina a stati deve essere sbloccato ().

Assicurarsi che la sottofinestra della macchina a stati sia attiva. Nella casella degli strumenti macchina a stati fare clic sullo strumento Scegli segmento e rilasciare il pulsante del mouse (non trascinare lo strumento dalla barra degli strumenti). A questo punto, quando si passa il mouse sul diagramma di stato attivo, il puntatore del mouse passa allo strumento segmento di scelta con l’icona “proibito” (), perché un segmento di scelta può essere aggiunto solo a un’estremità quadrata non collegata di una transizione () o a un segmento di scelta esistente (). Quando si passa il mouse su un punto di attacco consentito per un segmento di scelta, il puntatore del mouse passa allo strumento segmento di scelta con l’ancora (). Per aggiungere il segmento di scelta a questo punto di attacco, premere il pulsante del mouse e trascinare il segmento di scelta fino al bordo desiderato dello stato di destinazione. Il percorso di transizione così stabilito corrisponderà a una transizione regolare da stato a stato con una guardia.

È inoltre possibile aggiungere un segmento di scelta che diventerà una transizione interna con una guardia. Per fare ciò, è sufficiente trascinare la fine del segmento di scelta e rilasciarlo non su alcun bordo di stato. A questo punto, il segmento di scelta diventerà una transizione interna. La transizione interna viene eseguita interamente all’interno dello stato di origine e non porta mai a un cambiamento di stato.

Nota La notazione UML “normativa” standard non consente di aggiungere segmenti di transizione interni agli pseudostati di scelta. Al contrario, la rappresentazione non normativa delle transizioni interne in QM™ consente di aggiungere facilmente segmenti di transizione interni agli pseudostati di scelta e di modificare rapidamente e intuitivamente il tipo di transizione collegando / staccando l’estremità della transizione a / da uno stato.

Infine, puoi anche aggiungere un segmento di scelta a un’estremità non collegata di un altro segmento di scelta, come illustrato nell’animazione seguente:

Nota Questa opzione di aggiungere segmenti di scelta a segmenti di scelta già esistenti significa che è possibile creare guardie nidificate complesse. Tuttavia, come con tutte le condizioni di guardia, è necessario utilizzare questa funzione con giudizio per evitare il codice “spaghetti”.

L’elemento del segmento di scelta può essere configurato dal foglio di proprietà specifico della scelta.

la Scelta del Segmento delle Proprietà

La Scelta del Segmento di proprietà foglio contiene le seguenti proprietà:

  • la Scelta di Guardia
  • Scelta di Destinazione (non modificabile–determinato geometricamente)
  • Scelta di Azione

Scelta Guardia

Ogni scelta segmento in QM™ necessario disporre di un’esplicita guardia di proprietà, che si compone di due voci: pseudocodice e codice. Solo la voce di codice della proprietà guard è rilevante per la generazione del codice. La voce pseudocodice è progettata solo per essere visualizzata nel diagramma per evitare confusione riducendo al minimo la quantità di testo da visualizzare accanto alla forma di transizione.

Attenzione La voce Pseudocodice della proprietà guard è destinata solo alla visualizzazione nella casella di testo associata al segmento choice, ma non ha implicazioni per la generazione del codice. Nota La proprietà guard viene visualizzata nella casella di testo del segmento di scelta in base alle stesse regole della casella di testo Transizione. Inoltre, per ridurre il disordine nel diagramma, la guardia viene mostrata in una forma abbreviata, dove tutti gli spazi nella guardia vengono rimossi e il testo della guardia risultante viene troncato a 32 caratteri. (Quando la guardia viene troncata, l’ultimo carattere è ‘~’).

Per la generazione corretta del codice, la voce di codice della proprietà guard deve essere un’espressione booleana C o C++ legale. L’espressione può utilizzare gli attributi della macchina a stati (tramite il puntatore me) e i parametri dell’evento di attivazione (vedere la sezione seguente).

Accesso all’evento di attivazione: L’espressione guard può accedere all’evento di attivazione originale (della transizione a cui la scelta è collegata direttamente o indirettamente), che viene fornito come puntatore e del tipo (QEvt const * const). Ciò significa che hai accesso in sola lettura all’evento e non puoi modificare il puntatore e. Per accedere ai parametri evento dell’evento di attivazione originale, in genere è necessario eseguire il downcast del puntatore evento e. Questo downcast si basa sempre sul trigger di transizione (segnale dell’evento di attivazione, vedere Trigger di transizione), il che significa che è sempre necessario conoscere il tipo di evento (classe evento) associato al trigger.

Target di scelta

La proprietà target non è modificabile direttamente, ma è determinata geometricamente dal punto finale del segmento di scelta. Per le transizioni da stato a stato, la proprietà target elenca lo stato di destinazione in cui termina end-point (). Per le transizioni interne con il punto finale quadrato (), la proprietà target mostra internal.

Azione Choice

Un segmento Choice può avere una proprietà action opzionale, che viene eseguita solo quando la guardia viene valutata TRUE in fase di runtime (vedere anche L’Ordine di valutazione dell’azione).

La proprietà action è composta da due voci: pseudocodice e codice (vedere Scheda proprietà scelta). Solo la parte di codice della proprietà action è rilevante per la generazione del codice. Il campo pseudocodice è progettato solo per essere visualizzato nel diagramma per evitare confusione riducendo al minimo la quantità di testo da visualizzare accanto alla forma di transizione.

Nota La voce Pseudocodice della proprietà action è destinata solo alla visualizzazione nel diagramma e non ha implicazioni per la generazione del codice.

Puntatore all’evento di attivazione: il codice di azione scelta spesso deve accedere all’evento di attivazione, che viene fornito come puntatore e del tipo (QEvt const * const). Ciò significa che hai accesso in sola lettura all’evento e non puoi modificare il puntatore e. Per accedere ai parametri evento dell’evento di attivazione, in genere è necessario eseguire il downcast del puntatore evento e. Questo downcast si basa sempre sul trigger di transizione (segnale dell’evento di attivazione, vedere Trigger di transizione), il che significa che è sempre necessario conoscere il tipo di evento (classe evento) associato al trigger.

Casella di testo Scelta

Una volta selezionato l’elemento Segmento scelta come Elemento corrente, è possibile visualizzare il contorno della casella di testo associata al segmento scelta. La casella di testo consente di spostare e ridimensionare il testo scelto trascinandolo o trascinando la maniglia della casella di testo in base allo stesso algoritmo della casella di testo di transizione.

Else Guard

La proprietà guard può essere definita come la parola chiave else speciale. Tale guardia else integra qualsiasi altra condizione di guardia associata allo stesso pseudostato di scelta. La protezione else può essere specificata nella voce codice o nella voce pseudocodice della proprietà guard. Ovviamente, la guardia “else” ha senso solo per uno pseudostato di scelta con più segmenti di scelta in uscita.

Nota Durante la generazione del codice, la guardia else verrà sempre generata per ultima all’interno del gruppo di tutte le guardie associate allo stesso pseudostato choice, indipendentemente dal suo ordine in Model Explorer.

Segmenti di scelta senza altro

Secondo la specifica UML, un evento che non può essere elaborato a causa di tutte le guardie che valutano FALSE deve essere trattato come non elaborato, il che significa che deve essere propagato al / i superstato / i. Questo requisito ha implicazioni per gli pseudostati di scelta senza un segmento else esplicito. In particolare, per rispettare la semantica UML, il generatore di codice QM ™ genererà in questi casi un ramo implicito else che causerà la propagazione dell’evento al / i superstato / i.

Si noti che esiste una differenza tra uno pseudostato choice con un segmento else vuoto e uno pseudostato choice altrimenti identico senza il segmento else. L’esplicito vuoto else farà sì che l’evento venga consumato (senza fare nulla), mentre l’assenza del segmento else farà sì che l’evento si propaghi ai superstati.

Ordine di valutazione della guardia

La specifica UML richiede che le condizioni di guardia associate allo stesso pseudostato di scelta siano reciprocamente complementari, in modo che l’ordine di valutazione delle guardie non abbia importanza. Mentre mantenere le guardie complementari è ancora raccomandato in QM™, lo strumento valuta le guardie sempre nell’ordine predeterminato, su cui puoi fare affidamento.

L’ordine di valutazione della guardia è determinato dall’ordine degli elementi del segmento di scelta in Esplora modelli. Questo ordine può essere modificato tramite i pulsanti Su e Giù sulla barra degli strumenti di Explorer. In alternativa, l’elemento corrente può essere spostato verso l’alto o verso il basso all’interno di Esplora modelli tramite le scorciatoie da tastiera: Ctrl-(tasto-su) e Ctrl-(tasto-giù).

Nota In caso di sovrapposizioni di protezioni quando l’ordine di valutazione della guardia è importante, si consiglia vivamente di disporre graficamente i segmenti di scelta nel diagramma nello stesso ordine di Model Explorer, come illustrato nella schermata sopra. Il codice generato seguirà quindi lo stesso ordine, come mostrato a destra del diagramma sopra.

Valutazione dell’ordine di azione

Qualsiasi segmento di scelta collegato a una transizione aggiunge le azioni del segmento di scelta all’azione eseguita dalla transizione. L’ordine di valutazione di tutte queste azioni è intuitivo e inizia sempre con l’azione di transizione eseguita incondizionatamente, seguita dalla valutazione condizionale delle azioni del segmento di scelta.

Ad esempio, l’ordine di valutazione dell’azione nel diagramma sopra è riassunto dal seguente pseudocodice:

. . .
caso TRIGONOMETRIA: {
/* azione di transizione… * /
action0 (); / * eseguito incondizionatamente */
/* segmenti di scelta… * /
se (g1()) {
azione1();
. . .
}
altro se (g2()) {
azione2();
. . .
}
else {
. . .
}
}
. . .

Segmenti di scelta nidificati

Come descritto sopra, i segmenti di scelta possono nidificare. Ciò consente di creare percorsi di transizione condizionali complessi, ma come sempre con le guardie, la funzione non dovrebbe essere abusata.

Per esempio, un errore comune è quello di utilizzare nidificazione scelta segmenti di scegliere tra una serie di possibili percorsi di transizione (vedi pannello (A) nel diagramma riportato di seguito):

Una migliore e alternativa molto più semplice è quello di utilizzare a scelta multipla segmenti collegati alla stessa scelta pseudostate, come mostrato nel pannello (B) nel diagramma di cui sopra.

Nota Ricorda che puoi collegare molti segmenti di scelta a una determinata transizione. Un diagramma con un numero minore di pseudostati di scelta (diamanti ) è un diagramma migliore, più facile da capire. Attenzione Il generatore di codice QM ™ limita il numero di livelli di nidificazione nel codice a 16 (incluso il nesting all’interno delle funzioni di gestione dello stato). L’uso di segmenti di scelta profondamente nidificati può facilmente superare questo limite.

Segmenti di scelta di routing

Una transizione con segmenti a scelta multipla, alcuni dei quali potenzialmente nidificati, raggruppa molti elementi in un piccolo spazio di diagramma. Per riorganizzare graficamente una “sfera di connettori” così complessa, è necessario essere consapevoli delle regole di base che si applicano in questa situazione.

La prima regola è che prima di poter modificare la forma di qualsiasi elemento, è necessario prima selezionarlo.

Ad esempio, se si desidera spostare la scelta-pseuodstate (il diamante ), è necessario fare clic sulla transizione originale in entrata alla scelta-pseudostate. Si prega di notare che in modo specifico non si dovrebbe fare clic sulla forma del diamante stesso, perché in realtà è una raccolta sovrapposta del transion-end in entrata più tutti i segmenti choce in uscita,quindi è ambiguo quale forma si intende effettivamente. Invece, si shouild fare clic su uno dei segmenti di transizione o l’inizio-fine del transiton. (NOTA: è anche possibile selezionare in modo univoco qualsiasi elemento del modello nella vista Esplora modelli). La seguente animazione illustra il processo:

D’altra parte, se si seleziona un segmento di scelta in uscita, non è possibile spostare lo pseudostato di scelta. Invece, ora puoi spostare solo il segmento di scelta selezionato per ricollegarlo da qualche altra parte.

Leave a Reply