Legge Til Valgsegment

Ofte I statsmaskiner, må du bare ta en tilstandsovergang når en bestemt tilstand (kalt vakttilstand) evaluerer TIL SANN ved kjøretid. Også, ganske ofte, må du gå over til forskjellige stater, avhengig av utfallet av noen vaktforhold evaluert ved kjøretid.

UML gir en spesiell konstruksjon, kalt “valg pseudostat”, som du kan bruke i slike situasjoner. En “valg pseudostate” lar deg dele en overgang til flere utgående baner, hver med sin egen vakt tilstand.

Merk Det er nyttig å tenke på valg pseudostat, slik som den som er vist i panel (B) i diagrammet ovenfor, som sammensattif (guard1()) {...} else if (guard2()) {...}– setningen(dette er faktisk HVORDAN QM™ kodegenerator implementerer valgsegmenter). Oppmerksomhet Fordi vakter fører tilIFs ogELSEs i koden, fører overbruk av dem til” spaghetti ” – kode og beseirer formålet med å bruke statsmaskiner i utgangspunktet. Av den grunn bør vakter brukes dømmende.

i DE FLESTE UML-verktøy består prosessen med å tegne valgsegmenter først av å legge til et” valg pseudostat ” (diamant) og deretter feste et utgående overgangssegment med en vakt. I qm™ denne prosessen er forenklet, fordi Staten Maskin Verktøykasse inneholder klar-til-bruk Valg Segment verktøy, som kombinerer en “valg pseudostate” med en overgang segment festet permanent til den.

Merk Valg Segment er DEN eneste måten I QM™ å feste en vakt tilstand til en overgang, som illustrert i panel (A) i diagrammet ovenfor. MEN QM™ Choice-Segmentet er kraftigere enn enkle vakter på overganger,som forklart i de følgende avsnittene. Hvis du vil legge til et valg-segment, må du først opprette og vise et tilstandsdiagram. I tillegg må statsmaskinen ha minst en intern overgang (avsluttet med ) eller et valgsegment (). Til slutt, hvis du vil legge til, flytte, endre størrelse på eller redigere valgsegmenter, Må Tilstandsmaskindiagrammet låses opp ().

Kontroller At State Machine subwindow er aktiv. I State Machine Toolbox klikker Du På Valg Segmentverktøyet og slipper museknappen (ikke dra verktøyet av verktøylinjen). Når du holder musepekeren over det aktive tilstandsdiagrammet, endres musepekeren til verktøyet for valgsegment med ikonet” forbudt ” (), fordi et valgsegment bare kan legges til en ikke-festet kvadratisk ende av en overgang () eller til et eksisterende valgsegment (). Når du holder musen over et tillatt vedleggspunkt for et valgsegment, endres musepekeren til valgsegmentverktøyet med ankeret (). Hvis du vil legge til valgsegmentet i dette vedleggspunktet, trykker du på museknappen og drar valgsegmentet ut til ønsket kant av måltilstanden. Overgangsbanen som dermed er etablert, vil tilsvare en vanlig statlig overgang med en vakt.

Du kan også legge til et valg segment som vil bli en intern overgang med en vakt. For å gjøre dette, drar du bare slutten av valgsegmentet og slipper det ikke på noen statskant. På dette tidspunktet vil valgsegmentet bli en intern overgang. Intern overgang utføres helt innenfor kildestaten og fører aldri til statsendring.

STANDARD” normative ” UML notasjon tillater ikke at du legger til interne overgangssegmenter til valg pseudostater. I MOTSETNING til den ikke-normative representasjonen av interne overganger i QM™ kan du enkelt legge til interne overgangssegmenter til valg pseudostater og raskt og intuitivt endre overgangstypen ved å feste / løsne overgangsenden til/fra en tilstand.

Til Slutt kan Du også legge til et valgsegment til en ikke-festet ende av et annet valgsegment, som illustrert i animasjonen nedenfor:

Obs! dette alternativet for å legge Til Valgsegmenter i Allerede eksisterende Valgsegmenter betyr at du kan bygge komplekse nestede vakter. Men som med alle vaktforhold, bør du bruke denne funksjonen dømmende for å unngå” spaghetti ” – kode.

Valg Segment element kan konfigureres Ved Valg-Spesifikke Egenskapsarket.

Egenskapsark For Valg-Segment

egenskapsarket For Valg-Segment inneholder følgende egenskaper:

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

Choice Guard

Hvert valgsegment I qm™ må ha en eksplisitt guard-egenskap, som består av to oppføringer: pseudokode og kode. Bare kodeoppføringen av guard-egenskapen er relevant for kodegenereringen. Pseudokodeoppføringen er utformet bare for å vises i diagrammet for å unngå rot ved å minimere mengden tekst som skal vises ved siden av overgangsfiguren.

Obs pseudokodeoppføringen til guard-egenskapen er bare ment for visning i Tekstboksen som er knyttet til valg-segmentet, men det har ingen implikasjoner for kodegenerering. Egenskapen guard vises I Tekstboksen i valg-segmentet i henhold til de samme reglene som Tekstboksen Overgang. I tillegg, for å redusere rot i diagrammet, vises vakt i forkortet form, der alle mellomrom i vakt fjernes og den resulterende vaktteksten avkortes med 32 tegn. (Når vakten er avkortet, er det siste tegnet’~’).

For vellykket kodegenerering Må Kodeoppføringen for egenskapen guard være Et Juridisk C-eller C++ Boolsk uttrykk. Uttrykket kan bruke tilstandsmaskinattributtene( via me-pekeren) og hendelsesparametrene for utløsende hendelse(se avsnittet nedenfor).

Tilgang Til Utløsende Hendelse: Guard-uttrykket kan få tilgang til den opprinnelige utløsende hendelsen (av overgangen som valget er festet direkte eller indirekte), som er gitt som e-pekeren av typen (QEvt const * const). Dette betyr at du har skrivebeskyttet tilgang til hendelsen, og du kan ikke endre pekeren e. For å få tilgang til hendelsesparametere for den opprinnelige utløsende hendelsen, må du vanligvis nedkaste hendelsespekeren e. Denne nedkastede er alltid basert på overgangsutløseren (signal av utløsende hendelse, se Overgangsutløser), noe som betyr at du alltid må vite hendelsestypen (hendelsesklasse) knyttet til utløseren.

Valgmål

målegenskapen kan ikke redigeres direkte, men bestemmes geometrisk av sluttpunktet i valgsegmentet. For tilstandsoverganger viser målegenskapen måltilstanden der sluttpunktet () avsluttes. For interne overganger med det firkantede endepunktet () viser målegenskapen internal.

Valghandling

Et Valgsegment kan ha valgfri handlingsegenskap, som bare utføres når guard evaluerer TIL SANN under kjøring(se Også Evaluering Av Handlingsrekkefølge).

handlingsegenskapen består av to oppføringer: pseudokode og kode(se Egenskapsark For Valg). Bare kodedelen av handlingsegenskapen er relevant for kodegenerering. Pseudokode-feltet er utformet bare for å vises i diagrammet for å unngå rot ved å minimere mengden tekst som skal vises ved siden av overgangsfiguren.

Obs! pseudokodeoppføringen til handlingsegenskapen er bare ment for visning i diagrammet, og har ingen implikasjoner for kodegenerering.

Peker til Utløserhendelsen: valghandlingskoden må ofte få tilgang til utløserhendelsen, som er gitt som e-pekeren av typen (QEvt const * const). Dette betyr at du har skrivebeskyttet tilgang til hendelsen, og du kan ikke endre pekeren e. For å få tilgang til hendelsesparametere for utløsende hendelse, må du vanligvis nedkaste hendelsespekeren e. Denne nedkastede er alltid basert på overgangsutløseren (signal av utløsende hendelse, se Overgangsutløser), noe som betyr at du alltid må vite hendelsestypen (hendelsesklasse) knyttet til utløseren.

Valg Tekstboks

Når Valg Segmentelementet er valgt Som Gjeldende Element, kan du se grensen For Tekstboksen knyttet til valg segmentet. Tekstboksen lar deg flytte og endre størrelsen på valgteksten ved å dra Den rundt Eller dra Tekstbokshåndtaket i henhold til samme algoritme som Tekstboksen Overgang.

else Guard

guard-egenskapen kan defineres som det spesielle else-søkeordet. Slike andre vakt utfyller alle andre vaktforhold knyttet til samme valg pseudostat. Else guard kan spesifiseres enten i kodeoppføring eller pseudokodeoppføring av guard-egenskapen. Åpenbart er” else ” vakt bare fornuftig for et valg pseudostat med flere utgående valgsegmenter.

Merk Under kodegenerering vil else guard alltid bli generert sist i gruppen av alle vakter som er knyttet til samme valg pseudostat, uavhengig av rekkefølgen i Modellutforskeren.

Valgsegmenter Uten andre

i HENHOLD TIL UML-spesifikasjonen, må en hendelse som ikke kan behandles på grunn av alle vakter som evalueres TIL FALSK, behandles som ubehandlet, noe som betyr at den må forplantes til superstaten(e). Dette kravet har implikasjoner for valg pseudostater uten et eksplisitt annet segment. Spesielt, for å overholde UML-semantikken, vil qm™ kodegenerator i slike tilfeller generere en implisitt else gren som vil forårsake forplantning av hendelsen til superstaten(e).

Merk Det er en forskjell mellom et valg pseudostat med et tomt annet segment og et ellers identisk valg pseudostat uten det andre segmentet. Den eksplisitte tomme else vil føre til at hendelsen blir konsumert (uten å gjøre noe), mens fraværet av else-segmentet vil føre til at hendelsen forplanter seg til superstaten (e).

Order Of Guard Evaluation

UML-spesifikasjonen krever at vaktforholdene knyttet til samme valg pseudostat er gjensidig komplementære, slik at evalueringsordren for vaktene ikke betyr noe. MENS det fortsatt anbefales å holde vaktene komplementære I QM™, evaluerer verktøyet vakter alltid i forhåndsbestemt rekkefølge, som du kan stole på.

rekkefølgen av vakt evaluering bestemmes av Rekkefølgen Av Valget Segment elementer I Modell Explorer. Denne rekkefølgen kan endres Ved Hjelp Av opp-og ned-knappene På Utforsker-Verktøylinjen. Alternativt kan Det Nåværende Elementet flyttes opp eller ned i Modellutforskeren ved hjelp av hurtigtastene: Ctrl-(key-up) Og Ctrl-(key-down).

Merk i tilfelle overlappende vakter når rekkefølgen av vakt evaluering saker, er det sterkt anbefalt å ordne Valg Segmenter grafisk i diagrammet i samme rekkefølge som I Modellen Explorer, som illustrert i skjermbildet ovenfor. Den genererte koden vil da følge samme rekkefølge, som vist til høyre for diagrammet ovenfor.

Evaluering Av Handlingsrekkefølge

eventuelle valgsegmenter som er knyttet til en overgang, legger til valg-segmenthandlingene i handlingen som utføres av overgangen. Evalueringsordren for alle disse handlingene er intuitiv og starter alltid med overgangshandlingen som utføres ubetinget, etterfulgt av betinget evaluering av valg-segmenthandlinger.

for eksempel er handlingsevalueringen i diagrammet ovenfor oppsummert av følgende pseudokode:

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

Nestede Valgsegmenter

Som beskrevet ovenfor Kan Valgsegmenter nestes. Dette gjør at du kan bygge komplekse betingede overgangsbaner, men som alltid med vakter, bør funksjonen ikke brukes for mye.

en vanlig feil er for eksempel å bruke dypt nestede valgsegmenter for å velge blant en rekke mulige overgangsbaner (se panel (A) i diagrammet nedenfor):

Et bedre og mye enklere alternativ er å bruke flervalgssegmenter knyttet til samme valg pseudostat, som vist i panel (B)i diagrammet ovenfor.

Merk Husk at du kan knytte mange valgsegmenter til en gitt overgang. Et diagram med mindre antall valg pseudostater (diamanter ) er et bedre, lettere å forstå diagram. Obs Qm™ kodegenerator begrenser antall hekkenivåer i koden til 16 (inkludert hekkende inside state-handler-funksjoner). Bruken av dypt nestede Valgsegmenter kan enkelt overskride denne grensen.

Routing Choice Segments

en overgang med flervalgssegmenter, noen av dem potensielt nestede, grupperer mange elementer i et lite diagramområde. For å grafisk re-arrangere en så kompleks “ball of connectors”, må du være oppmerksom på de grunnleggende reglene som gjelder i denne situasjonen.

den første regelen er at før du kan endre formen på et element, må du først velge det.

for eksempel, hvis du vil flytte valget-pseuodstate (diamanten ), må du klikke på den opprinnelige innkommende overgangen til valget-pseudostat. Vær oppmerksom på at du ganske spesifikt ikke bør klikke på diamantformen selv, fordi det faktisk er en overlappende samling av innkommende transion-end pluss alle utgående choce-segmentene, så det er tvetydig hvilken form du egentlig mener. I stedet klikker du på et av overgangssegmentene eller begynnelsen av transitonen. (MERK: du kan også entydig velge et hvilket som helst modellelement i Modellutforsker-visningen). Følgende animasjon illustrerer prosessen:

på den annen side, hvis du velger et utgående valg-segment, kan du ikke flytte valget-pseudostat. I stedet kan du nå flytte bare det valgte valg-segmentet for å feste det på nytt et annet sted.

Leave a Reply