tilføjelse af Valgsegment

ofte i statsmaskiner skal du kun tage en tilstandsovergang, når en bestemt tilstand (kaldet vagttilstand) evalueres til sand ved kørselstid. Også, ganske ofte, du har brug for at overgangen til forskellige stater, afhængigt af resultatet af nogle vagt betingelser evalueret på run-time.

UML giver en speciel konstruktion, kaldet “choice pseudostate”, som du kan bruge i sådanne situationer. En “choice pseudostate” giver dig mulighed for at opdele en overgang i flere udgående stier, hver med sin egen vagttilstand.

Bemærk Det er nyttigt at tænke på valg pseudostat, som den, der er vist i panel (B) i diagrammet ovenfor, som forbindelsenif (guard1()) {...} else if (guard2()) {...}erklæring (Dette er faktisk, hvordan kvm-kodegeneratoren implementerer valgsegmenter). Opmærksomhed fordi vagter fører tilIFs ogELSEs i koden, fører overforbrug af dem til “spaghetti” – kode og besejrer formålet med at bruge statsmaskiner i første omgang. Af den grund bør vagter bruges med omtanke.

i de fleste UML-værktøjer består processen med at tegne valgsegmenter af først at tilføje et “valg pseudostat” (diamant) og derefter vedhæfte et udgående overgangssegment med en vagt. I KMKR forenkles denne proces, fordi statens værktøjskasse indeholder et klar-til-brug Valgsegmentværktøj, der kombinerer et “valg pseudostat” med et overgangssegment, der er fastgjort permanent til det.

Bemærk valg Segment er den eneste måde i KML at vedhæfte en vagt tilstand til en overgang, som illustreret i panel (A) i diagrammet ovenfor. Men kvm-Valgsegmentet er mere kraftfuldt end enkle vagter ved overgange, som forklaret i de følgende afsnit. Bemærk For at tilføje et valgsegment skal du først oprette og vise et tilstandsdiagram. Derudover skal statsmaskinen have mindst en intern overgang (afsluttet med ) eller et valgsegment (). Endelig skal Tilstandsmaskindiagrammet låses op () for at tilføje, flytte, ændre størrelse eller redigere valgsegmenter.

sørg for, at Tilstandsmaskinens undervindue er aktiv. I staten værktøjskasse klik på valg Segment værktøj og slip museknappen (ikke trække værktøjet fra værktøjslinjen). På dette tidspunkt, når du holder musen hen over det aktive tilstandsdiagram, ændres musemarkøren til værktøjet valgsegment med ikonet “forbudt” (), fordi et valgsegment kun kan føjes til en ikke-knyttet firkantet ende af en overgang () eller til et eksisterende valgsegment (). Når du holder musen hen over et tilladt fastgørelsespunkt for et valgsegment, ændres musemarkøren til værktøjet valgsegment med ankeret (). For at tilføje valgsegmentet til dette vedhæftningspunkt skal du trykke på museknappen og trække valgsegmentenden ud til den ønskede kant af måltilstanden. Den således etablerede overgangsvej svarer til en regelmæssig tilstand-til-tilstand-overgang med en vagt.

du kan også tilføje et valg segment, der bliver en intern overgang med en vagt. For at gøre dette skal du blot trække slutningen af valgsegmentet og slippe det ikke på nogen statskant. På dette tidspunkt bliver valgsegmentet en intern overgang. Intern overgang udføres helt inden for kildetilstanden og fører aldrig til en tilstandsændring.

Bemærk standard” normativ ” UML-notation tillader dig ikke at tilføje interne overgangssegmenter til valg af pseudostater. I modsætning hertil giver den ikke-normative repræsentation af interne overgange i KMK dig mulighed for nemt at tilføje interne overgangssegmenter til valg af pseudostater og hurtigt og intuitivt ændre overgangstypen ved at fastgøre/løsne overgangsenden til/fra en tilstand.

endelig kan du også tilføje et valgsegment til en uafhængig ende af et andet valgsegment, som illustreret i animationen nedenfor:

Bemærk Denne mulighed for at tilføje Valgsegmenter til allerede eksisterende Valgsegmenter betyder, at du kan opbygge komplekse indlejrede afskærmninger. Men som med alle guard betingelser, bør du bruge denne funktion velovervejet at undgå” spaghetti ” kode.

Valgsegmentelement kan konfigureres af det Valgspecifikke egenskabsark.

valg-Segmentegenskabsark

Egenskabsarket Valgsegment indeholder følgende egenskaber:

  • Choice Guard
  • Choice Target (ikke redigerbart–bestemt geometrisk)
  • Choice Action

Choice Guard

hvert valgsegment i KVM. Kun kodeindtastningen af guard-ejendommen er relevant for kodegenereringen. Pseudokodeindtastningen er kun designet til at blive vist i diagrammet for at undgå rod ved at minimere mængden af tekst, der skal vises ved siden af overgangsformen.

opmærksomhed Pseudokodeindtastningen af guard-egenskaben er kun beregnet til visning i tekstfeltet, der er knyttet til valgsegmentet, men det har ingen konsekvenser for kodegenerering. Bemærk egenskaben vagt vises i tekstfeltet i det valgte segment efter de samme regler som tekstfeltet overgang. For at reducere rodet i diagrammet vises beskyttelsen i forkortet form, hvor alle mellemrum i beskyttelsen fjernes, og den resulterende beskyttelsestekst afkortes med 32 tegn. (Når vagten er afkortet, er det sidste tegn’~’).

for vellykket kodegenerering skal kodeindtastningen af guard-ejendommen være et lovligt C-eller C++ boolsk udtryk. Udtrykket kan bruge tilstandsmaskinattributterne (via me-markøren) og hændelsesparametrene for den udløsende begivenhed (Se afsnit nedenfor).

adgang til udløsende begivenhed: Beskyttelsesudtrykket kan få adgang til den oprindelige udløsende begivenhed (af overgangen, som valget er knyttet direkte eller indirekte), som leveres som E-markøren af typen (QEvt const * const). Det betyder, at du har skrivebeskyttet adgang til begivenheden, og du kan ikke ændre markøren e. For at få adgang til begivenhedsparametre for den oprindelige udløsende begivenhed, du skal typisk nedslå begivenhedsmarkøren e. Denne nedslåede er altid baseret på overgangsudløseren (signal for den udløsende begivenhed, Se Overgangsudløser), hvilket betyder, at du altid skal kende begivenhedstypen (begivenhedsklasse), der er knyttet til udløseren.

valgmål

målegenskaben kan ikke redigeres direkte, men bestemmes snarere geometrisk af slutpunktet for valgsegmentet. For stat-til-stat-overgange viser egenskaben mål den måltilstand, hvor slutpunktet () afsluttes. For interne overgange med det firkantede slutpunkt () viser målegenskaben internal.

valghandling

et Valgsegment kan have valgfri handlingsegenskab, som kun udføres, når beskyttelsen evalueres til sand ved kørsel (se også handlingsrækkefølge).

handlingsegenskaben består af to poster: pseudokode og kode (Se valg egenskabsark). Kun kodedelen af handlingsegenskaben er relevant for kodegenereringen. Pseudokodefeltet er kun designet til at blive vist i diagrammet for at undgå rod ved at minimere mængden af tekst, der skal vises ved siden af overgangsfiguren.

Bemærk Pseudokodeindtastningen af handlingsegenskaben er kun beregnet til visning i diagrammet og har ingen konsekvenser for kodegenerering.

markør til den udløsende begivenhed: valghandlingskoden skal ofte have adgang til den udløsende begivenhed, som leveres som E-markøren af typen (QEvt const * const). Det betyder, at du har skrivebeskyttet adgang til begivenheden, og du kan ikke ændre markøren e. For at få adgang til hændelsesparametre for den udløsende begivenhed, du skal typisk nedslå hændelsesmarkøren e. Denne nedslåede er altid baseret på overgangsudløseren (signal for den udløsende begivenhed, Se Overgangsudløser), hvilket betyder, at du altid skal kende begivenhedstypen (begivenhedsklasse), der er knyttet til udløseren.

valg tekstfelt

når elementet valg Segment er valgt som det aktuelle element, kan du se grænsen for det tekstfelt, der er knyttet til segmentet valg. Tekstfeltet giver dig mulighed for at flytte og ændre størrelsen på valgteksten ved at trække den rundt eller trække Tekstbokshåndtaget i henhold til den samme algoritme som tekstfeltet overgang.

else Guard

guard-egenskaben kan defineres som det specielle else-nøgleord. En sådan anden vagt supplerer alle andre beskyttelsesbetingelser, der er knyttet til det samme valg pseudostat. Else guard kan specificeres enten i kodeindtastningen eller pseudokodeindtastningen af guard-ejendommen. Det er klart, at” else ” – vagten kun giver mening for et valg pseudostat med flere udgående valgsegmenter.

Bemærk Under kodegenereringen genereres else guard altid sidst inden for gruppen af alle vagter, der er forbundet med det samme valg pseudostat, uanset dens rækkefølge i Modeludforskeren.

Valgsegmenter uden andet

i henhold til UML-specifikationen skal en begivenhed, der ikke kan behandles på grund af alle vagter, der evalueres til FALSE, behandles som uforarbejdet, hvilket betyder, at den skal formeres til superstat(erne). Dette krav har konsekvenser for valg pseudostater uden et eksplicit andet segment. Specifikt for at overholde UML-semantikken genererer kvm-kodegeneratoren i sådanne tilfælde en implicit else gren, der vil forårsage udbredelse af begivenheden til superstaterne.

Bemærk Der er forskel på en choice pseudostate med et tomt else segment og en ellers identisk choice pseudostate uden else segmentet. Den eksplicitte tomme else vil medføre, at begivenheden forbruges (uden at gøre noget), mens fraværet af else-segmentet vil medføre, at begivenheden spredes til superstaterne.

Order of Guard Evaluation

UML-specifikationen kræver, at beskyttelsesbetingelserne knyttet til det samme valg pseudostat er gensidigt komplementære, så rækkefølgen af evaluering af vagterne ikke betyder noget. Mens det stadig anbefales at holde vagterne komplementære i KVM, evaluerer værktøjet altid vagter i den forudbestemte rækkefølge, som du kan stole på.

rækkefølgen af vagtevaluering bestemmes af rækkefølgen af Valgsegmentelementerne i Modelforskeren. Denne rækkefølge kan ændres ved hjælp af knapperne Op og ned på Stifinder-værktøjslinjen. Alternativt kan det aktuelle element flyttes op eller ned i Modeludforskeren ved hjælp af tastaturgenveje: Ctrl-(nøgle-op) og Ctrl-(nøgle-ned).

Bemærk i tilfælde af overlappende vagter, når rækkefølgen af vagtevaluering betyder noget, anbefales det stærkt at arrangere Valgsegmenterne grafisk i diagrammet i samme rækkefølge som i Modeludforskeren, som illustreret i skærmbilledet ovenfor. Den genererede kode følger derefter den samme rækkefølge, som vist til højre for diagrammet ovenfor.

handlingsrækkefølge

alle valgsegmenter, der er knyttet til en overgang, føjer handlingerne valgsegment til den handling, der udføres af overgangen. Rækkefølgen for evaluering af alle disse handlinger er intuitiv og starter altid med overgangshandlingen, der udføres ubetinget, efterfulgt af den betingede evaluering af valgsegmenthandlinger.

for eksempel opsummeres rækkefølgen af handlingsevaluering i diagrammet ovenfor ved hjælp af følgende pseudokode:

. . .
sag TRIG: {
/* overgang handling… * /
action0 (); / * udført ubetinget */
/* valg segmenter… * /
if (g1()) {
handling1();
. . .
}
ellers hvis (g2()) {
handling2();
. . .
}
else {
. . .
}
}
. . .

indlejrede Valgsegmenter

som beskrevet ovenfor kan Valgsegmenter reden. Dette giver dig mulighed for at opbygge komplekse betingede overgangsstier, men som altid med vagter bør funktionen ikke overanvendes.

for eksempel er en almindelig fejl at bruge dybt indlejrede valgsegmenter til at vælge mellem et antal mulige overgangsstier (se panel (A) i diagrammet nedenfor):

et bedre og meget enklere alternativ er at bruge multiple choice-segmenter knyttet til det samme valg pseudostat, som vist i panel (B) i diagrammet ovenfor.

Bemærk Husk, at du kan vedhæfte mange valgsegmenter til en given overgang. Et diagram med mindre antal valg pseudostater (diamanter ) er et bedre, lettere at forstå diagram. Bemærk kvm-kodegeneratoren begrænser antallet af indlejringsniveauer i koden til 16 (inklusive indlejringsfunktioner inde i statshåndteringsfunktioner). Brugen af dybt indlejrede Valgsegmenter kan let overskride denne grænse.

routing Choice Segments

en overgang med multiple choice-segmenter, nogle af dem potentielt indlejrede, grupperer mange elementer i et lille diagramrum. For grafisk at omarrangere en så kompleks” kugle af stik”, skal du være opmærksom på de grundlæggende regler, der gælder i denne situation.

den første regel er, at før du kan ændre formen på et element, skal du først vælge det.

for eksempel, hvis du vil flytte choice-pseuodstate (diamanten ), skal du klikke på den oprindelige indgående overgang til choice-pseudostate. Pleease bemærk, at du helt specifikt ikke skal klikke på selve diamantformen, fordi det faktisk er en overlappet samling af den indkommende transion-ende plus alle de udgående choce-segmenter, så det er tvetydigt, hvilken form du faktisk mener. I stedet skal du klikke på et af overgangssegmenterne eller begyndelsen af transitonen. (Bemærk: Du kan også entydigt vælge et hvilket som helst modelelement i visningen Modeludforsker). Følgende animation illustrerer processen:

på den anden side, hvis du vælger et udgående valgsegment, kan du ikke flytte valg-pseudostaten. I stedet kan du nu bare flytte det valgte valgsegment for at vedhæfte det et andet sted.

Leave a Reply