het toevoegen van Keuzesegment
vaak in toestandsmachines, hoeft u alleen een toestands-overgang te maken wanneer een specifieke voorwaarde (genaamd wachtvoorwaarde) evalueert naar TRUE tijdens run-time. Ook, heel vaak, je nodig hebt om de overgang naar verschillende staten, afhankelijk van de uitkomst van een aantal wachtomstandigheden geëvalueerd tijdens run-time.
de UML biedt een speciale constructie, genaamd “choice pseudostate”, die u in dergelijke situaties kunt gebruiken. Een “choice pseudostate” staat je toe om een overgang te splitsen in meerdere uitgaande paden, elk met zijn eigen guard conditie.
merk op dat het nuttig is om na te denken over de keuze pseudostaat, zoals die in Paneel (B) van het diagram hierboven, als de samenstellingif (guard1()) {...} else if (guard2()) {...}
statement (Dit is in feite hoe de QM™ codegenerator keuzesegmenten implementeert). Aandacht, omdat bewakers leiden totIF
s enELSE
s in de code, leidt overmatig gebruik ervan tot “spaghetti” – code en het doel van het gebruik van state machines in de eerste plaats. Daarom moeten bewakers verstandig worden gebruikt.
in de meeste UML-gereedschappen bestaat het proces van het tekenen van keuzesegmenten uit het toevoegen van een “keuzepseudostaat” (diamant) en vervolgens het bevestigen van een uitgaand overgangssegment met een guard. In QM™ is dit proces vereenvoudigd, omdat de gereedschapskist kant-en-klare Keuzesegmenttool bevat, die een “keuzepseudostaat” combineert met een overgangssegment dat er permanent aan is bevestigd.
Notitiekeusegment is de enige manier in QM™ om een wachtconditie aan een overgang te koppelen, zoals geïllustreerd in Paneel (A) van het bovenstaande diagram. Maar het qm ™ Choice Segment is krachtiger dan eenvoudige bewakers op overgangen, zoals uitgelegd in de volgende secties. OPMERKING Om een keuzesegment toe te voegen, moet u eerst een toestanddiagram maken en weergeven. Bovendien moet de toestandsmachine ten minste één interne overgang (afgesloten met ) of een keuzesegment () hebben. Tot slot, om keuzesegmenten toe te voegen, te verplaatsen, van grootte te veranderen of te bewerken, moet het Statusmachinediagram worden ontgrendeld ().
zorg ervoor dat het subvenster van de State Machine actief is. Klik In de gereedschapskist status op het Keuzesegmentgereedschap en laat de muisknop los (sleep het gereedschap niet van de werkbalk). Op dit punt, wanneer u met de muis over het actieve toestandsdiagram beweegt, verandert de muisaanwijzer in het keuzesegmentgereedschap met het “verboden” pictogram (), omdat een keuzesegment alleen kan worden toegevoegd aan een ongebonden vierkant-einde van een overgang () of aan een bestaand keuzesegment (). Wanneer u met de muisaanwijzer over een Toegestaan bijlagepunt voor een keuzesegment beweegt, verandert de muisaanwijzer in het keuzesegmentgereedschap met het anker (). Om het keuzesegment aan dit bijlagepunt toe te voegen, drukt u op de muisknop en sleept u het keuzesegment naar de gewenste rand van de doeltoestand. Het aldus vastgestelde overgangspad komt overeen met een regelmatige overgang van staat naar staat met een wacht.
u kunt ook een keuzesegment toevoegen dat een interne overgang wordt met een guard. Om dit te doen, sleept u gewoon het einde van het keuzesegment en laat het niet op een rand van de staat vallen. Op dit moment zal het keuzesegment een interne transitie worden. Interne transitie wordt volledig uitgevoerd binnen de bronstaat en leidt nooit tot een verandering van staat.
merk op dat de standaard “normatieve” UML notatie je niet toestaat om interne overgangssegmenten toe te voegen aan pseudostates. Daarentegen stelt de niet-normatieve representatie van interne overgangen in QM™ u in staat om eenvoudig interne overgangssegmenten toe te voegen aan pseudostates van de keuze en om snel en intuïtief het overgangstype te wijzigen door het overgangseinde naar/van een toestand te koppelen/los te maken.
ten slotte kunt u ook een keuzesegment toevoegen aan een niet-verbonden einde van een ander keuzesegment, zoals in de animatie hieronder wordt geïllustreerd:
deze optie om Keuzesegmenten toe te voegen aan reeds bestaande Keuzesegmenten betekent dat u complexe geneste bewakers kunt bouwen. Echter, zoals met alle wacht voorwaarden, moet u deze functie verstandig te gebruiken om te voorkomen dat “spaghetti” code.
keuze Segment item kan worden geconfigureerd door de keuze-specifieke eigenschappenvenster.
De Keuze Segment eigenschappenblad bevat de volgende eigenschappen:
- Keuze Guard
- Keuze Doelgroep (niet bewerkbaar is bepaald geometrisch)
- Keuze Action
Keuze Guard
Elke keuze segment in QM™ moet een expliciete guard goederen, die bestaat uit twee items: pseudocode en code. Alleen de code-ingang van de eigenschap guard is relevant voor het genereren van de code. De pseudocode ingang is ontworpen om alleen te worden weergegeven in het diagram om rommel te voorkomen door het minimaliseren van de hoeveelheid tekst weer te geven naast de overgang vorm.
let op de Pseudocode ingang van de guard eigenschap is alleen bedoeld voor weergave in het tekstvak geassocieerd met het keuzesegment, maar het heeft geen implicaties voor het genereren van code. Opmerking de eigenschap guard wordt weergegeven in het tekstvak van het keuzesegment volgens dezelfde regels als het tekstvak overgang. Bovendien, om de rommel in het diagram te verminderen, wordt de guard weergegeven in een verkorte vorm, waar alle spaties in de guard worden verwijderd en de resulterende guard tekst wordt afgekapt op 32 tekens. (Als de guard afgekapt is, is het laatste teken’~’).
voor een succesvolle codegeneratie moet de code ingang van de guard eigenschap een legale C of C++ Booleaanse uitdrukking zijn. De expressie kan gebruik maken van de status machine attributen (via de me pointer), en de event parameters van de triggering event (zie paragraaf hieronder).
toegang tot de activerende gebeurtenis: De guard-expressie kan toegang krijgen tot de oorspronkelijke triggeringgebeurtenis (van de overgang waaraan de keuze direct of indirect is gekoppeld), die wordt geleverd als de e-pointer van het type (QEvt const * const)
. Dit betekent dat u alleen-lezen toegang hebt tot de gebeurtenis, en u kunt de e
aanwijzer niet wijzigen. Om toegang te krijgen tot gebeurtenisparameters van de oorspronkelijke triggering event, moet je meestal de event pointer e downcast. Deze downcast is altijd gebaseerd op de transitie trigger (signaal van de triggeringgebeurtenis, zie transitie Trigger), wat betekent dat u altijd het gebeurtenistype (event class) moet kennen dat aan de trigger is gekoppeld.
keuze doel
de eigenschap doel is niet direct bewerkbaar, maar wordt geometrisch bepaald door het eindpunt van het keuzesegment. Voor statusovergangen wordt in de eigenschap doel de doelstatus weergegeven waarmee het eindpunt () wordt beëindigd. Voor interne overgangen met het vierkant eindpunt (), toont de eigenschap doel internal
.
Keuzeactie
een Keuzesegment kan optionele actie-eigenschap hebben, die alleen wordt uitgevoerd wanneer de guard tijdens runtime evalueert naar TRUE (zie ook volgorde van actie-evaluatie).
de eigenschap Actie bestaat uit twee items: pseudocode en code (zie eigenschappenblad keuze). Alleen het codegedeelte van de eigenschap actie is relevant voor het genereren van de code. Het veld pseudocode is alleen ontworpen om te worden weergegeven in het diagram om rommel te voorkomen door het minimaliseren van de hoeveelheid tekst weer te geven naast de overgang vorm.
merk op dat de Pseudocode ingang van de eigenschap actie alleen bedoeld is voor weergave in het diagram en geen implicaties heeft voor het genereren van code.
Pointer to the Triggering Event: de keuzeactiecode moet vaak toegang hebben tot de triggering event, die wordt geleverd als de e pointer van het type (QEvt const * const)
. Dit betekent dat u alleen-lezen toegang hebt tot de gebeurtenis, en u kunt de e
aanwijzer niet wijzigen. Om toegang te krijgen tot de gebeurtenisparameters van de triggering event, moet je meestal de event pointer e downcast. Deze downcast is altijd gebaseerd op de transitie trigger (signaal van de triggeringgebeurtenis, zie transitie Trigger), wat betekent dat u altijd het gebeurtenistype (event class) moet kennen dat aan de trigger is gekoppeld.
Keuzetekstkader
zodra het Keuzesegment-item is geselecteerd als het huidige Item, kunt u de grens zien van het tekstkader dat bij het keuzesegment hoort. Het tekstvak kunt u verplaatsen en de grootte van de tekst van de keuze door het te slepen rond of het slepen van het tekstvak handvat volgens hetzelfde algoritme als de overgang tekstvak.
de Else Guard
de eigenschap guard kan worden gedefinieerd als het speciale else sleutelwoord. Dergelijke else guard vormt een aanvulling op alle andere guard voorwaarden verbonden aan dezelfde keuze pseudostaat. De Else guard kan worden gespecificeerd in de code ingang of pseudocode ingang van de guard eigenschap. Uiteraard is de” else ” guard alleen zinvol voor een keuze pseudostaat met meerdere uitgaande keuze segmenten.
opmerking tijdens de codegeneratie zal de Else guard altijd als laatste worden gegenereerd binnen de groep van alle guards die geassocieerd zijn met dezelfde pseudostaatkeuze, ongeacht de volgorde in de Modelverkenner.
Keuzesegmenten zonder anders
volgens de UML-specificatie moet een gebeurtenis die niet kan worden verwerkt omdat alle wachters die op onwaar beoordelen, als onverwerkt worden behandeld, wat betekent dat het moet worden doorgegeven aan de superstaat(en). Deze eis heeft gevolgen voor pseudostatica zonder expliciet else-segment. Specifiek, om te voldoen aan de UML semantiek, zal de QM™ codegenerator in dergelijke gevallen een impliciete else
branch genereren die verspreiding van de gebeurtenis naar de superstaat(s) zal veroorzaken.
merk op dat er een verschil is tussen een keuze pseudostaat met een leeg else segment en een anders identieke keuze pseudostaat zonder het else segment. De expliciete lege else zal ervoor zorgen dat de gebeurtenis wordt geconsumeerd (zonder iets te doen), terwijl de afwezigheid van het else segment ervoor zorgt dat de gebeurtenis zich verspreidt naar de superstaat(s).
Evaluatievolgorde van de bescherming
de UML-specificatie vereist dat de voorwaarden van de bescherming die aan dezelfde pseudostaatkeuze zijn verbonden elkaar aanvullen, zodat de volgorde van beoordeling van de bescherming niet van belang is. Terwijl het houden van de bewakers complementair is nog steeds aanbevolen in QM™, de tool evalueert bewakers altijd in de vooraf bepaalde volgorde, waarop u kunt vertrouwen.
de volgorde van de wacht evaluatie wordt bepaald door de volgorde van de keuze Segment items in de Model Explorer. Deze volgorde kan worden gewijzigd door middel van de knoppen Omhoog en omlaag op de werkbalk Explorer. Als alternatief kan het huidige Item in de Modelverkenner omhoog of omlaag worden verplaatst met de sneltoetsen Ctrl-(key-up) en Ctrl-(key-down).
opmerking in geval van overlappende afschermingen wanneer de volgorde van de beoordeling van de beveiliging van belang is, is het sterk aanbevolen om de Keuzesegmenten grafisch in het diagram in dezelfde volgorde als in de Modelverkenner te rangschikken, zoals weergegeven in de schermafbeelding hierboven. De gegenereerde code volgt dan dezelfde volgorde, zoals weergegeven aan de rechterkant van het diagram hierboven.
volgorde van actie evaluatie
alle keuzesegmenten die aan een transitie zijn gekoppeld, voegen de keuzesegmentacties toe aan de actie die door de transitie wordt uitgevoerd. De volgorde van evaluatie van al deze acties is intuïtief en begint altijd met de transitie actie onvoorwaardelijk uitgevoerd, gevolgd door de voorwaardelijke evaluatie van keuze-segment acties.
bijvoorbeeld, de volgorde van actie evaluatie in het bovenstaande diagram wordt samengevat door de volgende pseudocode:
geneste Keuzesegmenten
zoals hierboven beschreven, kunnen Keuzesegmenten nestelen. Dit stelt u in staat om complexe voorwaardelijke overgangspaden te bouwen, maar zoals altijd met bewakers, moet de functie niet te veel worden gebruikt.
een veel voorkomende fout is bijvoorbeeld om diep geneste keuzesegmenten te gebruiken om te kiezen uit een aantal mogelijke overgangspaden (zie Paneel (A) in het onderstaande diagram)):
een beter en veel eenvoudiger alternatief is het gebruik van meerkeuzesegmenten die aan dezelfde pseudostaat zijn gekoppeld, zoals weergegeven in Paneel (B) in het diagram hierboven.
onthoud dat u veel keuzesegmenten aan een bepaalde overgang kunt koppelen. Een diagram met een kleiner aantal pseudostaten (diamanten ) is een beter, gemakkelijker te begrijpen diagram. Let op de QM ™ codegenerator beperkt het aantal nestelniveaus in de code tot 16 (inclusief de nesting binnen state-handler functies). Het gebruik van diep geneste Keuzesegmenten kan deze limiet gemakkelijk overschrijden.
Routeringskeuze segmenten
een overgang met meerkeuzesegmenten, waarvan sommige potentieel geneste, groepeert veel elementen in een kleine diagramruimte. Om zo ‘ n complexe “bal van connectoren” grafisch opnieuw te rangschikken, moet u zich bewust zijn van de basisregels die in deze situatie van toepassing zijn.
de eerste regel is dat voordat u de vorm van een element kunt wijzigen, u het eerst moet selecteren.
als u bijvoorbeeld de choice-pseuodstate (de diamant) wilt verplaatsen, moet u op de oorspronkelijke inkomende overgang naar de choice-pseudostate klikken. Please merk op dat je heel specifiek niet op de diamantvorm zelf moet klikken, omdat het eigenlijk een overlappende verzameling is van de inkomende transie-end plus alle uitgaande choce segmenten, dus het is dubbelzinnig welke vorm je eigenlijk bedoelt. In plaats daarvan moet je klikken op een van de overgangssegmenten of het begin-einde van de transiton. (Opmerking: U kunt ook ondubbelzinnig een modelitem selecteren in de modelverkenner-weergave). De volgende animatie illustreert het proces:
aan de andere kant, als u een uitgaande keuze-segment selecteert, kunt u de keuze-pseudostaat niet verplaatsen. In plaats daarvan kunt u nu alleen het geselecteerde keuzesegment verplaatsen om het ergens anders opnieuw te bevestigen.
Leave a Reply