lägga till Valsegment

ofta i tillståndsmaskiner behöver du bara ta en tillståndsövergång när ett specifikt tillstånd (kallat guard condition) utvärderas till TRUE vid körning. Också ganska ofta måste du övergå till olika stater, beroende på resultatet av vissa skyddsförhållanden som utvärderas vid körning.

UML tillhandahåller en speciell konstruktion, kallad “Choice pseudostate”, som du kan använda i sådana situationer. Ett “val pseudostat” låter dig dela en övergång till flera utgående vägar, var och en med sitt eget vaktförhållande.

Observera att det är användbart att tänka på valet pseudostat, såsom den som visas i panel (B) i diagrammet ovan, som föreningenif (guard1()) {...} else if (guard2()) {...}uttalande (Detta är i själva verket hur QM oscillator kodgenerator implementerar val segment). Uppmärksamhet eftersom vakter leder tillIFs ochELSEs i koden, överanvändning av dem leder till “spaghetti” – kod och besegrar syftet med att använda statliga maskiner i första hand. Av den anledningen bör vakter användas klokt.

i de flesta UML-verktyg består processen att rita valsegment av att först lägga till ett “valpseudostat” (diamant) och sedan fästa ett utgående övergångssegment med ett skydd. I qm ig denna process förenklas, eftersom State Machine Toolbox innehåller färdiga att använda Choice Segment tool, som kombinerar en “choice pseudostat” med en övergång segment fäst permanent till det.

Note Choice-segmentet är det enda sättet i qm Macau att fästa ett skyddsförhållande till en övergång, som illustreras i panel (a) i diagrammet ovan. Men QM-valet av valsegment är kraftfullare än enkla vakter vid övergångar, vilket förklaras i följande avsnitt. OBS! För att lägga till ett valsegment måste du först skapa och visa ett tillståndsdiagram. Dessutom måste tillståndsmaskinen ha minst en intern övergång (avslutas med ) eller ett val segment (). Slutligen, för att lägga till, flytta, ändra storlek på eller redigera valsegment, måste tillståndsmaskindiagrammet vara upplåst ().

kontrollera att Statsmaskinens underfönster är aktivt. I verktygslådan State Machine klicka på Choice Segment tool och släpp musknappen (dra inte verktyget från verktygsfältet). När du håller muspekaren över det aktiva tillståndsdiagrammet ändras muspekaren till verktyget choice-segment med ikonen “forbidden” (), eftersom ett choice-segment bara kan läggas till i en obunden fyrkantig ände av en övergång () eller till ett befintligt choice-segment (). När du håller muspekaren över en tillåten fästpunkt för ett valsegment ändras muspekaren till valsegmentverktyget med ankaret (). Om du vill lägga till valsegmentet i denna fästpunkt trycker du på musknappen och drar valsegmentets ände ut till önskad kant av måltillståndet. Den sålunda etablerade övergångsvägen kommer att motsvara en regelbunden statlig övergång med en vakt.

du kan också lägga till ett valsegment som blir en intern övergång med en vakt. För att göra detta drar du helt enkelt slutet på valsegmentet och släpper det inte på någon statskant. Vid denna tidpunkt blir valsegmentet en intern övergång. Intern övergång utförs helt inom källtillståndet och leder aldrig till en förändring av tillståndet.

Obs! standard” normativ ” UML-notation tillåter dig inte att lägga till interna övergångssegment till valpseudostater. Däremot kan den icke-normativa representationen av interna övergångar i qm ig du enkelt lägga till interna övergångssegment till valpseudostater och snabbt och intuitivt ändra övergångstypen genom att fästa/ta bort övergångsänden till/från ett tillstånd.

slutligen kan du också lägga till ett valsegment i en obunden ände av ett annat valsegment, som illustreras i animeringen nedan:

Obs! Det här alternativet om du vill lägga till Valsegment i redan befintliga Valsegment innebär att du kan bygga komplexa kapslade vakter. Men som med alla vaktförhållanden bör du använda den här funktionen klokt för att undvika “spaghetti” – kod.

Valsegmentobjekt kan konfigureras av det Valspecifika Egenskapsbladet.

Egenskapsblad för Valsegment

Egenskapsblad för Valsegment innehåller följande egenskaper:

  • Choice Guard
  • Choice Target (ej redigerbart–bestämt geometriskt)
  • Choice Action

Choice Guard

varje Choice-segment i qm måste ha en explicit guard-egenskap, som består av två poster: pseudokod och kod. Endast kodinmatningen av guard-egenskapen är relevant för kodgenerering. Pseudokodposten är endast avsedd att visas i diagrammet för att undvika röran genom att minimera mängden text som ska visas bredvid övergångsformen.

Obs Pseudokodinmatningen av egenskapen guard är endast avsedd att visas i textrutan som är associerad med valsegmentet, men det har inga konsekvenser för kodgenerering. Obs! egenskapen guard visas i textrutan i valsegmentet enligt samma regler som textrutan övergång. Dessutom, för att minska röran i diagrammet, visas skyddet i förkortad form, där alla mellanslag i skyddet tas bort och den resulterande skyddstexten trunkeras med 32 tecken. (När vakten trunkeras är det sista tecknet’~’).

för framgångsrik kodgenerering måste Kodinmatningen av guard-egenskapen vara ett lagligt C-eller C++ booleskt uttryck. Uttrycket kan använda tillståndsmaskinattributen (via me-pekaren) och händelseparametrarna för den utlösande händelsen (se avsnittet nedan).

åtkomst till den utlösande händelsen: Guard-uttrycket kan komma åt den ursprungliga utlösande händelsen (av övergången till vilken valet är direkt eller indirekt), som tillhandahålls som E-pekaren av typen (QEvt const * const). Det betyder att du har skrivskyddad åtkomst till händelsen och att du inte kan ändra pekaren e. För att komma åt händelseparametrar för den ursprungliga utlösande händelsen, du behöver vanligtvis nedkasta händelsepekaren e. Denna nedslagna baseras alltid på övergångsutlösaren (signal för utlösningshändelsen, se Övergångsutlösare), vilket innebär att du alltid måste känna till händelsetypen (händelseklass) som är associerad med utlösaren.

Valmål

målegenskapen kan inte redigeras direkt, utan bestäms geometriskt av slutpunkten för valsegmentet. För state-to-state-övergångar listar målegenskapen det måltillstånd där slutpunkten () avslutas. För interna övergångar med den fyrkantiga slutpunkten () visar målegenskapen internal.

Valåtgärd

ett Valsegment kan ha valfri åtgärdsegenskap, som endast körs när vakten utvärderas till TRUE vid körning (se även Åtgärdsordning utvärdering).

åtgärdsegenskapen består av två poster: pseudokod och kod (SE Egenskapsblad för val). Endast koddelen av åtgärdsegenskapen är relevant för kodgenerering. Pseudokodfältet är endast utformat för att visas i diagrammet för att undvika röran genom att minimera mängden text som ska visas bredvid övergångsformen.

Obs! Pseudokodinmatningen av åtgärdsegenskapen är endast avsedd att visas i diagrammet och har inga konsekvenser för kodgenerering.

pekare till den utlösande händelsen: valåtgärdskoden behöver ofta komma åt den utlösande händelsen, som tillhandahålls som E-pekaren av typen (QEvt const * const). Det betyder att du har skrivskyddad åtkomst till händelsen och att du inte kan ändra pekaren e. För att komma åt händelseparametrar för den utlösande händelsen, du behöver vanligtvis nedkasta händelsepekaren e. Denna nedslagna baseras alltid på övergångsutlösaren (signal för utlösningshändelsen, se Övergångsutlösare), vilket innebär att du alltid måste känna till händelsetypen (händelseklass) som är associerad med utlösaren.

textruta för val

när objektet för Valsegment har valts som aktuellt objekt kan du se gränsen för textrutan som är associerad med valsegmentet. Textrutan låter dig flytta och ändra storlek på valtexten genom att dra den runt eller dra textrutans handtag enligt samma algoritm som Övergångstextrutan.

else Guard

egenskapen guard kan definieras som nyckelordet special else. Sådan annan vakt kompletterar alla andra skyddsförhållanden som är knutna till samma val pseudostat. Else guard kan anges antingen i kodinmatningen eller pseudokodinmatningen av guard-egenskapen. Självklart är” else ” guard endast meningsfullt för ett val pseudostat med flera utgående valsegment.

under kodgenereringen kommer else guard alltid att genereras sist inom gruppen av alla vakter som är associerade med samma val pseudostat, oavsett dess ordning i Model Explorer.

Valsegment utan annat

enligt UML-specifikationen måste en händelse som inte kan behandlas på grund av att alla vakter utvärderar till falskt behandlas som obearbetad vilket innebär att den måste förökas till superstaten(s). Detta krav har konsekvenser för valpseudostater utan ett uttryckligt annat segment. Specifikt, för att följa UML-semantiken, kommer qm: s kodgenerator att generera i sådana fall en implicit else – gren som kommer att orsaka förökning av händelsen till superstaten(erna).

det finns en skillnad mellan ett val pseudostat med ett tomt else-segment och ett i övrigt identiskt val pseudostat utan else-segmentet. Den uttryckliga tomma else kommer att orsaka att händelsen konsumeras(utan att göra någonting), medan frånvaron av else-segmentet kommer att få händelsen att sprida sig till superstate (s).

Order of Guard Evaluation

UML-specifikationen kräver att vaktförhållandena som är knutna till samma valpseudostat kompletterar varandra, så att utvärderingsordningen för vakterna inte spelar någon roll. Samtidigt som vakterna är kompletterande rekommenderas fortfarande i qm Macau, verktyget utvärderar vakterna alltid i förutbestämd ordning, som du kan lita på.

ordningen för vaktutvärdering bestäms av ordningen för Valsegmentobjekten i Model Explorer. Denna ordning kan ändras med hjälp av upp-och nedknapparna i Explorer-verktygsfältet. Alternativt kan det aktuella objektet flyttas upp eller ner i Model Explorer med hjälp av kortkommandona: Ctrl-(key-up) och Ctrl-(key-down).

Obs! vid överlappande vakter när ordningen för vaktutvärdering är viktig rekommenderas det starkt att ordna Valsegmenten grafiskt i diagrammet i samma ordning som i Model Explorer, som illustreras i skärmbilden ovan. Den genererade koden följer sedan samma ordning, som visas till höger om diagrammet ovan.

Handlingsordning utvärdering

alla valsegment kopplade till en övergång Lägg till valsegmentåtgärderna till åtgärden som utförs av övergången. Utvärderingsordningen för alla dessa åtgärder är intuitiv och börjar alltid med övergångsåtgärden som utförs ovillkorligt, följt av den villkorliga utvärderingen av valsegmentåtgärder.

till exempel sammanfattas handlingsordningen i diagrammet ovan med följande pseudokod:

. . .
fall TRIG: {
/* övergångsåtgärder… * /
action0 (); / * utförs ovillkorligt */
/* val segment… * /
om (g1()) {
åtgärd1();
. . .
}
annars om (g2()) {
action2();
. . .
}
annars {
. . .
}
}
. . .

kapslade Valsegment

som beskrivits ovan kan Valsegment häckas. Detta gör att du kan bygga komplexa villkorliga övergångsvägar, men som alltid med vakter bör funktionen inte överanvändas.

till exempel är ett vanligt misstag att använda djupt kapslade valsegment för att välja bland ett antal möjliga övergångsvägar (se panel (A) i diagrammet nedan):

ett bättre och mycket enklare alternativ är att använda flervalssegment kopplade till samma valpseudostat, som visas i panel (B) i diagrammet ovan.

Obs kom ihåg att du kan bifoga många valsegment till en given övergång. Ett diagram med mindre antal val pseudostater (diamanter ) är ett bättre, lättare att förstå diagram. Observera qm-kodgeneratorn i den här koden begränsar antalet häckningsnivåer i koden till 16 (inklusive häckningsfunktionen i tillståndshanterarens funktioner). Användningen av djupt kapslade Valsegment kan lätt överskrida denna gräns.

Routing Choice Segments

en övergång med flervalssegment, några av dem potentiellt kapslade, grupperar många element i ett litet diagramutrymme. För att grafiskt omorganisera en så komplex “boll av kontakter” måste du vara medveten om de grundläggande reglerna som gäller i denna situation.

den första regeln är att innan du kan ändra formen på något element måste du först välja det.

om du till exempel vill flytta valet-pseuodstate (diamanten) måste du klicka på den ursprungliga inkommande övergången till valet-pseudostat. Pleease Observera att du helt specifikt inte ska klicka på diamantformen själv, eftersom det faktiskt är en överlappad samling av inkommande transion-end plus alla utgående choce-segment, så det är tvetydigt vilken form du faktiskt menar. Istället shouild du klicka på en av övergångssegmenten eller början-slutet av transiton. (OBS: Du kan också entydigt välja vilken modell som helst i vyn Model Explorer). Följande animering illustrerar processen:

å andra sidan, om du väljer ett utgående val-segment, kan du inte flytta valet-pseudostat. Istället kan du nu flytta bara det valda valsegmentet för att fästa det igen någon annanstans.

Leave a Reply