dodawanie segmentu wyboru

często w maszynach stanowych, musisz wykonać przejście stanu tylko wtedy, gdy określony warunek (zwany stanem ochronnym) zostanie obliczony na TRUE w czasie pracy. Ponadto, dość często, trzeba przejść do różnych stanów, w zależności od wyniku niektórych warunków straży ocenianych w czasie pracy.

UML zapewnia specjalną konstrukcję, zwaną “pseudostatem wyboru”, którą można wykorzystać w takich sytuacjach. “Pseudostate wyboru” pozwala podzielić przejście na wiele ścieżek wychodzących, z których każda ma swój własny stan ochronny.

Uwaga warto pomyśleć o pseudostacie wyboru, takim jak ten pokazany w panelu (B) na powyższym diagramie, jako o złożonej instrukcjiif (guard1()) {...} else if (guard2()) {...}(w rzeczywistości jest to sposób, w jaki generator kodu QM™ implementuje segmenty wyboru). Uwaga ponieważ strażnicy prowadzą doIFs iELSEs w kodzie, nadużywanie ich prowadzi do” spaghetti ” kodu i niszczy cel używania maszyn stanowych w pierwszej kolejności. Z tego powodu należy rozsądnie korzystać ze strażników.

w większości narzędzi UML proces rysowania segmentów wyboru polega na Najpierw dodaniu “pseudostatu wyboru” (diamentu), a następnie dołączeniu wychodzącego segmentu przejściowego z osłoną. W QM™ proces ten jest uproszczony, ponieważ State Machine Toolbox zawiera gotowe do użycia narzędzie segmentu wyboru, które łączy “pseudostat wyboru” z dołączonym na stałe do niego segmentem przejściowym.

Uwaga Segment wyboru jest jedynym sposobem w QM™, aby dołączyć warunek ochronny do przejścia, jak pokazano w panelu (a) na powyższym schemacie. Ale Segment qm ™ Choice jest bardziej wydajny niż proste osłony na przejściach, jak wyjaśniono w poniższych sekcjach. Uwaga aby dodać segment wyboru, musisz najpierw utworzyć i pokazać diagram stanu. Dodatkowo, maszyna stanowa musi mieć co najmniej jedno wewnętrzne przejście (zakończone ) lub segment wyboru (). Na koniec, aby dodać, przenieść, zmienić rozmiar lub edytować segmenty wyboru, diagram Maszyny stanowej musi być odblokowany ().

upewnij się, że subwindow Maszyny stanowej jest aktywny. W zestawie narzędzi Maszyny stanu kliknij na narzędzie segment wyboru i zwolnij przycisk myszy (nie przeciągaj narzędzia z paska narzędzi). W tym momencie, po najechaniu myszą na diagram stanu aktywnego, wskaźnik myszy zmienia się na narzędzie segment wyboru z ikoną” zabronionego ” (), ponieważ segment wyboru Może być dodany tylko do niezwiązanego kwadratu końca przejścia () lub do istniejącego segmentu wyboru (). Po najechaniu myszą na dozwolony punkt mocowania segmentu wyboru wskaźnik myszy zmienia się na narzędzie segment wyboru za pomocą kotwicy (). Aby dodać segment wyboru do tego punktu mocowania, naciśnij przycisk myszy i przeciągnij koniec segmentu wyboru na żądaną krawędź stanu docelowego. Ustalona w ten sposób ścieżka przejścia będzie odpowiadać regularnemu przechodzeniu od stanu do stanu ze strażą.

możesz również dodać segment wyboru, który stanie się wewnętrznym przejściem z osłoną. Aby to zrobić, wystarczy przeciągnąć koniec segmentu wyboru i upuścić go nie na żadnej krawędzi stanu. W tym momencie segment wyboru stanie się wewnętrznym przejściem. Wewnętrzne przejście jest wykonywane w całości w stanie źródłowym i nigdy nie prowadzi do zmiany stanu.

Uwaga standardowa notacja UML “normatywna”nie pozwala na dodawanie wewnętrznych segmentów przejściowych do wybranych pseudostatów. W przeciwieństwie do tego, nienormatywna reprezentacja przejść wewnętrznych w QM ™ umożliwia łatwe dodawanie wewnętrznych segmentów przejściowych do wybranych pseudostatów oraz szybką i intuicyjną zmianę typu przejścia poprzez dołączenie / odłączenie końca przejścia do / ze stanu.

wreszcie, można również dodać segment wyboru do niezwiązanego końca innego segmentu wyboru, jak pokazano na poniższej animacji:

Uwaga Ta opcja dodawania segmentów wyboru do już istniejących segmentów wyboru oznacza, że można tworzyć złożone zagnieżdżone osłony. Jednak, jak w przypadku wszystkich warunków guard, powinieneś używać tej funkcji rozsądnie, aby uniknąć kodu “spaghetti”.

element segmentu wyboru można skonfigurować za pomocą arkusza właściwości specyficznych dla wyboru.

wybór-Arkusz właściwości segmentu

Arkusz właściwości segmentu wyboru zawiera następujące właściwości:

  • Strażnik wyboru
  • cel wyboru (nieedytowalny–określony geometrycznie)
  • Akcja wyboru

Strażnik wyboru

każdy segment wyboru w QM™ musi mieć wyraźną właściwość guard, która składa się z dwóch wpisów: pseudokodu i kodu. Do generowania kodu ma znaczenie tylko wpis kodu nieruchomości strażnika. Wpis pseudokodu jest przeznaczony tylko do wyświetlania na diagramie, aby uniknąć bałaganu, minimalizując ilość tekstu do wyświetlenia obok kształtu przejścia.

Uwaga Pseudokodowy wpis właściwości guard jest przeznaczony tylko do wyświetlania w polu tekstowym związanym z segmentem wyboru, ale nie ma to wpływu na generowanie kodu. Uwaga właściwość guard jest wyświetlana w polu tekstowym segmentu wyboru zgodnie z tymi samymi regułami, co pole tekstowe przejścia. Dodatkowo, aby zmniejszyć bałagan na diagramie, osłona jest pokazana w skróconej formie, gdzie wszystkie spacje w osłonie są usuwane, a wynikowy tekst osłony jest obcinany na 32 znaki. (Gdy strażnik jest obcięty, ostatnim znakiem jest”~”).

dla pomyślnego generowania kodu, wpis kodu właściwości guard musi być zgodnym z prawem wyrażeniem logicznym C lub C++. Wyrażenie może wykorzystywać atrybuty maszyny stanu (poprzez wskaźnik me) oraz parametry zdarzenia wyzwalającego Zdarzenie (patrz sekcja poniżej).

: Wyrażenie guard może uzyskać dostęp do pierwotnego zdarzenia wyzwalającego (przejścia, do którego wybór jest podłączony bezpośrednio lub pośrednio), które jest dostarczane jako wskaźnik e typu (QEvt const * const). Oznacza to, że masz dostęp do zdarzenia Tylko do odczytu i nie możesz zmienić wskaźnika e. Aby uzyskać dostęp do parametrów zdarzenia oryginalnego zdarzenia wyzwalającego, zwykle musisz obniżyć wskaźnik zdarzenia e. Ten downcast jest zawsze oparty na wyzwalaczu przejścia (sygnale zdarzenia wyzwalającego, patrz WYZWALACZ przejścia), co oznacza, że musisz zawsze znać typ zdarzenia (klasę zdarzenia) powiązaną z wyzwalaczem.

Choice Target

właściwość target nie jest bezpośrednio edytowalna, ale jest wyznaczana geometrycznie przez punkt końcowy segmentu choice. W przypadku przejścia od stanu do stanu właściwość target wymienia stan docelowy, w którym kończy się funkcja end-point (). Dla wewnętrznych przejść z kwadratowym punktem końcowym (), właściwość target pokazuje internal.

Akcja Choice

segment Choice może mieć opcjonalną właściwość action, która jest wykonywana tylko wtedy, gdy strażnik Zwraca wartość TRUE w czasie wykonywania (patrz także kolejność oceny akcji).

właściwość action składa się z dwóch pozycji: pseudokodu i kodu (patrz arkusz właściwości Choice). Tylko część kodu właściwości action ma znaczenie dla generowania kodu. Pole pseudokod jest przeznaczone tylko do wyświetlania na diagramie, aby uniknąć bałaganu, minimalizując ilość tekstu do wyświetlenia obok kształtu przejścia.

Uwaga Pseudokodowy wpis właściwości action jest przeznaczony tylko do wyświetlania na diagramie i nie ma wpływu na generowanie kodu.

wskaźnik do zdarzenia wyzwalającego: kod akcji wyboru często musi uzyskać dostęp do zdarzenia wyzwalającego, które jest dostarczane jako wskaźnik e typu (QEvt const * const). Oznacza to, że masz dostęp do zdarzenia Tylko do odczytu i nie możesz zmienić wskaźnika e. Aby uzyskać dostęp do parametrów zdarzenia wyzwalającego, zwykle musisz obniżyć wskaźnik zdarzenia e. Ten downcast jest zawsze oparty na wyzwalaczu przejścia (sygnale zdarzenia wyzwalającego, patrz WYZWALACZ przejścia), co oznacza, że musisz zawsze znać typ zdarzenia (klasę zdarzenia) powiązaną z wyzwalaczem.

pole tekstowe wyboru

po wybraniu elementu segmentu wyboru jako bieżącego elementu można zobaczyć granicę pola tekstowego powiązanego z segmentem wyboru. Pole tekstowe pozwala przesuwać i zmieniać rozmiar tekstu wyboru, przeciągając go lub przeciągając Uchwyt pola tekstowego zgodnie z tym samym algorytmem, co pole tekstowe przejścia.

else Guard

właściwość guard może być zdefiniowana jako specjalne słowo kluczowe else. Taka osłona uzupełnia wszelkie inne warunki osłony dołączone do tego samego wyboru pseudostatu. Strażnik else może być określony we wpisie kodu lub pseudokodzie właściwości guard. Oczywiście strażnik “else” ma sens tylko dla pseudostatu wyboru z wieloma wychodzącymi segmentami wyboru.

Uwaga podczas generowania kodu, strażnik else zawsze będzie generowany jako ostatni w grupie wszystkich strażników powiązanych z tym samym pseudostatem wyboru, niezależnie od jego kolejności w Eksploratorze modelu.

selection Segments Without else

zgodnie ze specyfikacją UML, zdarzenie, które nie może być przetworzone z powodu wszystkich strażników oceniających NA FALSE, musi być traktowane jako nieprzetworzone, co oznacza, że musi być propagowane do superpaństwa(s). Wymóg ten ma implikacje dla pseudostatów wyboru bez wyraźnego segmentu else. W szczególności, aby zachować zgodność z semantyką UML, generator kodu QM™ wygeneruje w takich przypadkach implicit else gałąź, która spowoduje propagację zdarzenia do stanu (- ów) nadrzędnego (- ych).

zauważ, że istnieje różnica między pseudostatem wyboru z pustym segmentem else a identycznym pseudostatem wyboru bez segmentu else. Jawna pusta else spowoduje, że zdarzenie zostanie skonsumowane (bez robienia czegokolwiek), podczas gdy brak segmentu else spowoduje, że zdarzenie zostanie propagowane do superpan(s).

kolejność oceny strażnika

Specyfikacja UML wymaga, aby Warunki strażnika dołączone do tego samego pseudostatu wyboru były wzajemnie komplementarne, tak aby kolejność oceny strażnika nie miała znaczenia. Chociaż w QM™ nadal zaleca się uzupełnianie osłon, narzędzie ocenia osłony zawsze w ustalonej kolejności, na której możesz polegać.

kolejność oceny strażnika zależy od kolejności wybranych elementów segmentu w Eksploratorze modelu. Kolejność ta może być zmieniona za pomocą przycisków góra i dół na pasku narzędzi Eksploratora. Alternatywnie, bieżący element może być przesuwany w górę lub w dół w Eksploratorze modelu za pomocą skrótów klawiszowych: Ctrl-(klawisz-w górę) i Ctrl-(klawisz-w dół).

Uwaga W przypadku nakładania się osłon, gdy liczy się kolejność oceny osłon, zaleca się graficzne ułożenie wybranych segmentów na diagramie w takiej samej kolejności, jak w modelu Explorer, jak pokazano na powyższym zrzucie ekranu. Wygenerowany kod będzie następował w tej samej kolejności, jak pokazano po prawej stronie diagramu powyżej.

kolejność oceny działania

dowolne segmenty wyboru dołączone do przejścia dodają akcje choice-segment do akcji wykonywanej przez przejście. Kolejność oceny wszystkich tych działań jest intuicyjna i zaczyna się zawsze od akcji przejścia wykonanej bezwarunkowo, po której następuje warunkowa ocena akcji wyboru segmentu.

na przykład kolejność oceny działania na powyższym diagramie jest podsumowana za pomocą następującego pseudokodu:

. . .
case TRIG: {
/* akcja przejściowa… * /
action0 (); / * wykonywane bezwarunkowo */
/* segmenty wyboru… * /
if (g1()) {
działanie1();
. . .
}
else if (g2()) {
działania2();
. . .
}
else {
. . .
}
}
. . .

zagnieżdżone segmenty wyboru

jak opisano powyżej, segmenty wyboru mogą zagnieżdżać się. Pozwala to na tworzenie złożonych warunkowych ścieżek przejścia, ale jak zawsze w przypadku strażników, funkcja nie powinna być nadużywana.

na przykład częstym błędem jest użycie głęboko zagnieżdżonych segmentów wyboru do wyboru spośród wielu możliwych ścieżek przejścia (patrz panel (a) na poniższym diagramie):

lepszą i o wiele prostszą alternatywą jest użycie segmentów wielokrotnego wyboru dołączonych do tego samego pseudostatu wyboru, jak pokazano w panelu (B) na powyższym diagramie.

Uwaga Pamiętaj, że do danego przejścia możesz dołączyć wiele segmentów wyboru. Diagram o mniejszej liczbie wybranych pseudostatów (diamentów) jest lepszym, łatwiejszym do zrozumienia diagramem. Uwaga generator kodu QM ™ ogranicza liczbę poziomów zagnieżdżania w kodzie do 16 (w tym zagnieżdżanie wewnątrz funkcji obsługi stanu). Użycie głęboko zagnieżdżonych segmentów wyboru może łatwo przekroczyć ten limit.

Routing segmentów wyboru

przejście z segmentami wielokrotnego wyboru, niektóre z nich potencjalnie zagnieżdżone, grupuje wiele elementów w małej przestrzeni diagramu. Aby graficznie ponownie ułożyć tak złożoną “kulkę złączy”, musisz zdawać sobie sprawę z podstawowych zasad, które mają zastosowanie w tej sytuacji.

pierwsza zasada jest taka, że zanim będziesz mógł zmienić kształt dowolnego elementu, najpierw musisz go wybrać.

na przykład, jeśli chcesz przenieść wybór-pseudostate (diament ), musisz kliknąć oryginalne przychodzące przejście do wyboru-pseudostate. Proszę zauważyć, że nie powinieneś klikać na sam kształt diamentu, ponieważ jest to w rzeczywistości nakładający się zbiór przychodzącego końca transition plus wszystkie wychodzące segmenty choce, więc jest niejednoznaczne, który kształt faktycznie masz na myśli. Zamiast tego należy kliknąć jeden z segmentów przejściowych lub początek-koniec transitonu. (Uwaga: można również jednoznacznie wybrać dowolny element modelu w widoku Eksploratora modeli). Poniższa animacja ilustruje proces:

z drugiej strony, jeśli wybierzesz wychodzący segment wyboru, nie możesz przesunąć pseudostatu wyboru. Zamiast tego możesz teraz przenieść tylko wybrany segment wyboru, aby ponownie dołączyć go w inne miejsce.

Leave a Reply