adăugarea segmentului de alegere

adesea în mașinile de stat, trebuie să faceți o tranziție de stat numai atunci când o anumită condiție (numită condiție de pază) se evaluează la TRUE la run-time. De asemenea, destul de des, trebuie să treceți la diferite stări, în funcție de rezultatul unor condiții de pază evaluate în timpul rulării.

UML oferă o construcție specială, numită “pseudostat de alegere”, pe care o puteți utiliza în astfel de situații. Un “pseudostat de alegere” vă permite să împărțiți o tranziție în mai multe căi de ieșire, fiecare cu propria condiție de pază.

Notă este util să ne gândim la pseudostatul de alegere, cum ar fi cel prezentat în panoul (B) al diagramei de mai sus, ca compusif (guard1()) {...} else if (guard2()) {...}declarație (acesta este de fapt modul în care generatorul de cod qm VIII implementează segmente de alegere). Atenție deoarece gardienii duc laIFs șiELSES în cod, utilizarea excesivă a acestora duce la codul “spaghetti” și învinge scopul utilizării mașinilor de stat în primul rând. Din acest motiv, gardienii ar trebui folosiți în mod judicios.

în majoritatea instrumentelor UML, procesul de desenare a segmentelor de alegere constă în adăugarea mai întâi a unui” pseudostat de alegere ” (diamant) și apoi atașarea unui segment de tranziție de ieșire cu o gardă. În qm, acest proces este simplificat, deoarece mașina de scule de Stat conține un instrument de Segment de alegere gata de utilizare, care combină un “pseudostat de alegere” cu un segment de tranziție atașat permanent la acesta.

segmentul de alegere a notei este singura modalitate în qm de a atașa o condiție de protecție la o tranziție, așa cum este ilustrat în Panoul (a) din diagrama de mai sus. Dar segmentul de alegere qm-uri este mai puternic decât gardienii simpli pe tranziții, așa cum se explică în secțiunile următoare. Notă pentru a adăuga un segment de alegere, trebuie mai întâi să creați și să afișați o diagramă de stare. În plus, mașina de stat trebuie să aibă cel puțin o tranziție internă (terminată cu ) sau un segment de alegere (). În cele din urmă, pentru a adăuga, muta, redimensiona sau edita segmente de alegere, diagrama mașinii de stare trebuie deblocată ().

asigurați-vă că subfereastra mașinii de stare este activă. În caseta de instrumente mașină de Stat faceți clic pe instrumentul Segment alegere și eliberați butonul mouse-ului (nu trageți instrumentul de pe bara de instrumente). În acest moment, când treceți mouse-ul peste diagrama de stare activă, indicatorul mouse-ului se schimbă în instrumentul segment de alegere cu pictograma “interzis” (), deoarece un segment de alegere poate fi adăugat doar la un capăt pătrat neatasat al unei tranziții () sau la un segment de alegere existent (). Când plasați mouse-ul peste un punct de atașare permis pentru un segment de alegere, indicatorul mouse-ului se schimbă în instrumentul segment de alegere cu ancora (). Pentru a adăuga segmentul de alegere la acest punct de atașare, apăsați butonul mouse-ului și trageți capătul segmentului de alegere spre marginea dorită a stării țintă. Calea de tranziție astfel stabilită va corespunde unei tranziții regulate de la stat la stat cu un gardian.

de asemenea, puteți adăuga un segment de alegere care va deveni o tranziție internă cu un gardian. Pentru a face acest lucru, pur și simplu trageți sfârșitul segmentului de alegere și nu-l aruncați pe nici o margine de stat. În acest moment, segmentul de alegere va deveni o tranziție internă. Tranziția internă este executată în întregime în starea sursă și nu duce niciodată la o schimbare de stare.

notă notația UML standard “normativă” nu vă permite să adăugați segmente de tranziție internă la pseudostatele de alegere. În schimb, reprezentarea non-normativă a tranzițiilor interne în qm XV vă permite să adăugați cu ușurință segmente de tranziție interne la pseudostatele de alegere și să schimbați rapid și intuitiv tipul de tranziție prin Atașarea/detașarea capătului de tranziție la/de la o stare.

în cele din urmă, puteți adăuga, de asemenea, un segment de alegere la un capăt neatașat al unui alt segment de alegere, așa cum este ilustrat în animația de mai jos:

Notă Această opțiune de adăugare a segmentelor de alegere la segmentele de alegere deja existente înseamnă că puteți construi gărzi imbricate complexe. Cu toate acestea, ca și în cazul tuturor condițiilor de pază, ar trebui să utilizați această caracteristică în mod judicios pentru a evita codul “spaghete”.

elementul Segment de alegere poate fi configurat de foaia de proprietăți specifică alegerii.

Choice-Segment Property Sheet

foaia de proprietăți Choice Segment conține următoarele proprietăți:

  • Choice Guard
  • Choice Target (nu poate fi editat–determinat geometric)
  • Choice Action

Choice Guard

fiecare segment de alegere din qm-ul XC trebuie să aibă o proprietate explicită guard, care constă din două intrări: pseudocod și cod. Numai introducerea codului proprietății guard este relevantă pentru generarea codului. Intrarea pseudocod este proiectat doar pentru a fi afișate în diagrama pentru a evita dezordine prin minimizarea cantitatea de text pentru a afișa lângă forma de tranziție.

atenție intrarea pseudocod a proprietății guard este destinată numai afișării în caseta de Text asociată segmentului choice, dar nu are implicații pentru generarea de coduri. Notă proprietatea guard este afișată în caseta de Text a segmentului choice în conformitate cu aceleași reguli ca și caseta de text de tranziție. În plus, pentru a reduce dezordinea din diagramă, Garda este prezentată într-o formă prescurtată, unde toate spațiile din gardă sunt eliminate și textul de gardă rezultat este trunchiat la 32 de caractere. (Când paznicul este trunchiat, ultimul caracter este’~’).

pentru generarea cu succes a codului, introducerea codului proprietății guard trebuie să fie o expresie booleană legală C sau C++. Expresia poate utiliza atributele mașinii de stare (prin indicatorul me) și parametrii evenimentului declanșator (a se vedea secțiunea de mai jos).

accesarea evenimentului declanșator: Expresia guard poate accesa evenimentul declanșator inițial (al tranziției la care alegerea este atașată direct sau indirect), care este furnizat ca pointer e de tipul (QEvt const * const). Aceasta înseamnă că aveți acces numai în citire la eveniment și nu puteți modifica indicatorul e. Pentru a accesa parametrii evenimentului declanșator inițial, de obicei trebuie să reduceți indicatorul evenimentului e. Acest downcast se bazează întotdeauna pe declanșatorul de tranziție (semnalul evenimentului declanșator, vezi declanșatorul de tranziție), ceea ce înseamnă că trebuie să cunoașteți întotdeauna tipul de eveniment (clasa de evenimente) asociat declanșatorului.

țintă alegere

proprietatea țintă nu este editabil direct, ci mai degrabă este determinată geometric de punctul final al segmentului alegere. Pentru tranzițiile de la stat la stat, proprietatea țintă listează starea țintă la care se termină punctul final (). Pentru tranzițiile interne cu punctul final pătrat (), proprietatea țintă arată internal.

acțiune de alegere

un Segment de alegere poate avea proprietate de acțiune opțională, care este executată numai atunci când garda evaluează la TRUE în timpul rulării (vezi și ordinea evaluării acțiunii).

proprietatea acțiune constă din două intrări: pseudocod și cod (a se vedea foaia de proprietăți alegere). Numai partea de cod a proprietății de acțiune este relevantă pentru generarea de cod. Câmpul pseudocod este proiectat doar pentru a fi afișat în diagramă pentru a evita dezordinea prin minimizarea cantității de text de afișat lângă forma de tranziție.

notă intrarea pseudocod a proprietății de acțiune este destinată numai afișării în diagramă și nu are implicații pentru generarea de coduri.

Pointer la evenimentul declanșator: codul de acțiune de alegere trebuie adesea să acceseze evenimentul declanșator, care este furnizat ca pointer e de tipul (QEvt const * const). Aceasta înseamnă că aveți acces numai în citire la eveniment și nu puteți modifica indicatorul e. Pentru a accesa parametrii evenimentului declanșator, de obicei trebuie să reduceți indicatorul evenimentului e. Acest downcast se bazează întotdeauna pe declanșatorul de tranziție (semnalul evenimentului declanșator, vezi declanșatorul de tranziție), ceea ce înseamnă că trebuie să cunoașteți întotdeauna tipul de eveniment (clasa de evenimente) asociat declanșatorului.

Choice text Box

odată ce elementul Segment de alegere este selectat ca element curent, puteți vedea limita casetei de Text asociată segmentului de alegere. Caseta de Text vă permite să mutați și redimensiona textul alegere trăgându-l în jurul sau glisând mânerul caseta de Text în conformitate cu același algoritm ca și caseta de text de tranziție.

else Guard

proprietatea guard poate fi definită ca cuvântul cheie special else. O astfel de pază altceva completează orice alte condiții de pază atașate la aceeași alegere pseudostate. Else guard poate fi specificat fie în intrarea de cod, fie în intrarea pseudocod a proprietății guard. Evident, Garda “else” are sens doar pentru o pseudostată de alegere cu mai multe segmente de alegere de ieșire.

Notă În timpul generării codului, else guard va fi întotdeauna generat ultima dată în cadrul grupului tuturor gardienilor asociați cu aceeași pseudostată de alegere, indiferent de ordinea sa în Exploratorul modelului.

segmente de alegere fără altceva

Conform specificației UML, un eveniment care nu poate fi procesat din cauza tuturor gardurilor care evaluează la fals trebuie tratat ca neprelucrat, ceea ce înseamnă că trebuie propagat către superstat(uri). Această cerință are implicații pentru pseudostatele de alegere fără un segment explicit else. În mod specific, pentru a se conforma semanticii UML, generatorul de cod qm VIII va genera în astfel de cazuri o ramură implicită else care va determina propagarea evenimentului către superstat(uri).

Notă există o diferență între un pseudostat de alegere cu un segment else gol și un pseudostat de alegere altfel identic fără segmentul else. Else gol explicit va face ca evenimentul să fie consumat (fără a face nimic), în timp ce absența segmentului else va determina propagarea evenimentului către superstat(uri).

ordinul de evaluare a Gărzii

specificația UML impune ca condițiile de pază atașate aceluiași pseudostat de alegere să fie reciproc complementare, astfel încât ordinea de evaluare a gardienilor să nu conteze. În timp ce păstrarea gărzilor complementare este încă recomandată în qm XV, instrumentul evaluează gărzile întotdeauna în ordinea predeterminată, pe care vă puteți baza.

ordinea evaluării Gărzii este determinată de ordinea elementelor segmentului de alegere din exploratorul modelului. Această comandă poate fi modificată prin intermediul butoanelor sus și jos de pe bara de instrumente Explorer. Alternativ, elementul curent poate fi mutat în sus sau în jos în Exploratorul modelului prin intermediul comenzilor rapide de la tastatură: Ctrl-(tasta-sus) și Ctrl-(tasta-Jos).

Notă În cazul gărzilor suprapuse atunci când ordinea evaluării Gărzii contează, este foarte recomandat să aranjați segmentele de alegere grafic în diagramă în aceeași ordine ca în Exploratorul modelului, așa cum este ilustrat în captura de ecran de mai sus. Codul generat va urma apoi aceeași ordine, așa cum se arată în partea dreaptă a diagramei de mai sus.

ordinea evaluării acțiunii

orice segmente de alegere atașate unei tranziții adaugă acțiunile segmentului de alegere la acțiunea efectuată de tranziție. Ordinea de evaluare a tuturor acestor acțiuni este intuitivă și începe întotdeauna cu acțiunea de tranziție executată necondiționat, urmată de evaluarea condiționată a acțiunilor segmentului de alegere.

de exemplu, ordinea evaluării acțiunii din diagrama de mai sus este rezumată de următorul pseudocod:

. . .
caz trigonometrie: {
/* acțiune de tranziție… * /
action0 (); / * executat necondiționat */
/* segmente de alegere… * /
dacă (g1()) {
acțiune1();
. . .
}
altfel dacă (g2()) {
acțiune2();
. . .
}
else {
. . .
}
}
. . .

segmente de alegere imbricate

așa cum este descris mai sus, segmentele de alegere pot cuibări. Acest lucru vă permite să construiți căi complexe de tranziție condiționată, dar, ca întotdeauna cu gardienii, caracteristica nu ar trebui să fie suprautilizată.

de exemplu, o greșeală comună este de a utiliza segmente de alegere profund imbricate pentru a alege între un număr de căi de tranziție posibile (a se vedea panoul (A) în diagrama de mai jos):

o alternativă mai bună și mult mai simplă este utilizarea segmentelor cu alegere multiplă atașate aceluiași pseudostat de alegere, așa cum se arată în panoul (B) din diagrama de mai sus.

notă rețineți că puteți atașa mai multe segmente de alegere la o tranziție dată. O diagramă cu un număr mai mic de pseudostate de alegere (diamante ) este o diagramă mai bună și mai ușor de înțeles. Atenție generatorul de cod qm VIII limitează numărul de niveluri de cuibărire din cod la 16 (inclusiv funcțiile de cuibărire în interiorul stat-handler). Utilizarea segmentelor de alegere profund imbricate poate depăși cu ușurință această limită.

segmente de alegere de rutare

o tranziție cu segmente de alegere multiplă, unele dintre ele potențial imbricate, grupează multe elemente într-un spațiu mic de diagramă. Pentru a rearanja Grafic o astfel de “minge de conectori” complexă, trebuie să fiți conștienți de regulile de bază care se aplică în această situație.

prima regulă este că înainte de a putea schimba forma oricărui element, trebuie mai întâi să îl selectați.

de exemplu, dacă doriți să mutați choice-pseuodstate (diamantul ), trebuie să faceți clic pe tranziția inițială de intrare la choice-pseudostate. Pleease rețineți că destul de specific nu ar trebui să faceți clic pe forma de diamant în sine, pentru că este de fapt o colecție suprapusă de intrare transion-end, plus toate segmentele de ieșire choce, deci este ambiguu care forma te referi de fapt. În schimb, ar trebui să faceți clic pe unul dintre segmentele de tranziție sau pe începutul-sfârșitul tranzitului. (Notă: de asemenea, puteți selecta fără echivoc orice element model din vizualizarea model Explorer). Următoarea animație ilustrează procesul:

pe de altă parte, dacă selectați un segment de alegere de ieșire, nu puteți muta pseudostatul de alegere. În schimb, acum Puteți muta doar segmentul de alegere selectat pentru a-l atașa din nou în altă parte.

Leave a Reply