adicionando segmento de escolha

frequentemente em máquinas de estado, você precisa fazer uma transição de estado somente quando uma condição específica (chamada condição de guarda) for avaliada como verdadeira em tempo de execução. Além disso, muitas vezes você precisa fazer a transição para diferentes estados, dependendo do resultado de algumas condições de guarda avaliadas em tempo de execução.

o UML fornece uma construção especial, chamada “pseudoestado de escolha”, que você pode usar em tais situações. Um “pseudoestado de escolha” permite dividir uma transição em vários caminhos de saída, cada um com sua própria condição de guarda.

observe que é útil pensar sobre o pseudoestato de escolha, como o mostrado no painel (B) do diagrama acima, como a instrução compoundif (guard1()) {...} else if (guard2()) {...}(é de fato como o gerador de código QM™ implementa segmentos de escolha). Atenção porque os guardas levam aIFs eELSEs no código, o uso excessivo deles leva ao código “spaghetti” e derrota o propósito de usar máquinas de estado em primeiro lugar. Por esse motivo, os guardas devem ser usados criteriosamente.

na maioria das ferramentas UML, o processo de desenhar segmentos de escolha consiste em primeiro adicionar um “pseudoestato de escolha” (diamante) e, em seguida, anexar um segmento de transição de saída com um guarda. No QM™, esse processo é simplificado, porque a State Machine Toolbox contém a ferramenta de segmento de escolha pronta para uso, que combina um “pseudoestado de escolha” com um segmento de transição anexado permanentemente a ele.

Nota O segmento de escolha é a única maneira no QM™ de anexar uma condição de guarda a uma transição, conforme ilustrado no painel (a) do diagrama acima. Mas o segmento qm ™ Choice é mais poderoso do que simples guardas nas transições, conforme explicado nas seções a seguir. Nota para adicionar um segmento de escolha, primeiro você precisa criar e mostrar um diagrama de Estado. Além disso, a máquina de Estado deve ter pelo menos uma transição interna (terminada com ) ou um segmento de escolha (). Finalmente, para adicionar, mover, redimensionar ou editar segmentos de escolha, o diagrama da Máquina de Estado deve ser desbloqueado ().

certifique-se de que a subwindow da Máquina de Estado está ativa. Na caixa de ferramentas State Machine, clique na ferramenta Choice Segment e solte o botão do mouse (não arraste a ferramenta para fora da barra de ferramentas). Neste ponto, quando você passa o mouse sobre o diagrama de estado ativo, o ponteiro do mouse muda para a ferramenta de segmento de escolha com o ícone “proibido” (), porque um segmento de escolha só pode ser adicionado a uma extremidade quadrada não conectada de uma transição () ou a um segmento de escolha existente (). Quando você passa o mouse sobre um ponto de fixação permitido para um segmento de escolha, o ponteiro do mouse muda para a ferramenta de segmento de escolha com a âncora (). Para adicionar o segmento de escolha a este ponto de fixação, pressione o botão do mouse e arraste o segmento de escolha para a borda desejada do Estado de destino. O caminho de transição assim estabelecido corresponderá a uma transição regular de Estado para estado com um guarda.

você também pode adicionar um segmento de escolha que se tornará uma transição interna com um guarda. Para fazer isso, basta arrastar o final do segmento de escolha e soltá-lo não em nenhuma borda de Estado. Neste ponto, o segmento de escolha se tornará uma transição interna. A transição interna é executada inteiramente dentro do Estado de origem e nunca leva a uma mudança de Estado.

observe que a notação UML padrão “normativa” não permite adicionar segmentos de transição internos a pseudoestados de escolha. Em contraste, a representação não normativa de transições internas no QM™ permite que você adicione facilmente segmentos de transição internos a pseudoestados de escolha e altere rápida e intuitivamente o tipo de transição anexando/desconectando o final de transição de/para um estado.

finalmente, você também pode adicionar um segmento de escolha a uma extremidade não conectada de outro segmento de escolha, conforme ilustrado na animação abaixo:

observação esta opção de adicionar segmentos de escolha a segmentos de escolha já existentes significa que você pode criar guardas aninhados complexos. No entanto, como em todas as condições de guarda, você deve usar esse recurso criteriosamente para evitar o código “spaghetti”.

o item do segmento de escolha pode ser configurado pela Folha de propriedades específica da escolha.

a Escolha do Segmento de Folha de Propriedades de

A Escolha do Segmento de folha de propriedades contém as seguintes propriedades:

  • Escolha Guarda
  • Escolha o Destino (não editável–determinado geometricamente)
  • Escolha a Ação

Escolha de Guarda

Cada escolha segmento QM™ deve ter uma explícita guarda de propriedade, que consiste de duas entradas: pseudocódigo e código. Apenas a entrada de código da propriedade guard é relevante para a geração de código. A entrada pseudocódigo é projetada apenas para ser exibida no diagrama para evitar a desordem, minimizando a quantidade de texto a ser exibida ao lado da forma de transição.

atenção a entrada de pseudocódigo da propriedade guard destina-se apenas a ser exibida na caixa de texto associada ao segmento choice, mas não tem implicações para a geração de código. Observação a propriedade guarda é exibida na caixa de texto do segmento de escolha de acordo com as mesmas regras da caixa de texto transição. Além disso, para reduzir a desordem no diagrama, o guarda é mostrado de forma abreviada, onde todos os espaços no guarda são removidos e o texto de guarda resultante é truncado em 32 caracteres. (Quando o guarda é truncado, o último caractere é ‘~’).

para uma geração de código bem-sucedida, a entrada de código da propriedade guard deve ser uma expressão booleana C ou C++ legal. A expressão pode usar os atributos da máquina de estado (por meio do ponteiro me) e os parâmetros de Evento do evento de disparo (consulte a seção abaixo).

acessando o evento de disparo: A expressão Guarda Pode acessar o evento de disparo original (da transição para a qual a escolha é anexada direta ou indiretamente), que é fornecido como o ponteiro e do tipo (QEvt const * const). Isso significa que você tem acesso somente leitura ao evento e não pode alterar o ponteiro e. Para acessar os parâmetros de Evento do evento de disparo original, você normalmente precisa baixar o ponteiro do evento e. Este downcast é sempre baseado no gatilho de transição (sinal do evento de disparo, consulte gatilho de transição), o que significa que você deve sempre saber o tipo de Evento (classe de evento) associado ao gatilho.

Choice Target

a propriedade target não é editável diretamente, mas é determinada geometricamente pelo ponto final do segmento choice. Para transições de Estado para estado, a propriedade de destino lista o estado de destino no qual o ponto final () termina. Para transições internas com o ponto final quadrado (), a propriedade target mostra internal.

ação de escolha

um segmento de escolha pode ter propriedade de ação opcional, que é executada apenas quando o guarda é avaliado como verdadeiro em tempo de execução (consulte também ordem de Avaliação de ação).

a propriedade action consiste em duas entradas: pseudocódigo e código (consulte a folha de propriedades Choice). Somente a parte do Código da propriedade action é relevante para a geração de código. O campo pseudocódigo é projetado apenas para ser exibido no diagrama para evitar a desordem, minimizando a quantidade de texto a ser exibido ao lado da forma de transição.

observe que a entrada Pseudocódica da propriedade action destina-se apenas à exibição no diagrama e não tem implicações para a geração de código.

ponteiro para o evento de disparo: o código de ação de escolha geralmente precisa acessar o evento de disparo, que é fornecido como o ponteiro e do tipo (QEvt const * const). Isso significa que você tem acesso somente leitura ao evento e não pode alterar o ponteiro e. Para acessar os parâmetros de Evento do evento de disparo, normalmente é necessário fazer downcast do ponteiro de Evento E. Este downcast é sempre baseado no gatilho de transição (sinal do evento de disparo, consulte gatilho de transição), o que significa que você deve sempre saber o tipo de Evento (classe de evento) associado ao gatilho.

caixa de texto de escolha

uma vez que o item do segmento de escolha é selecionado como o Item atual, você pode ver o limite da caixa de texto associada ao segmento de escolha. A caixa de texto permite mover e redimensionar o texto de escolha arrastando-o ou arrastando o identificador da caixa de texto de acordo com o mesmo algoritmo da caixa de texto de transição.

o else Guard

a propriedade guard pode ser definida como a palavra-chave else especial. Essa outra guarda complementa quaisquer outras condições de guarda anexadas ao mesmo pseudoestato de escolha. O else guard pode ser especificado na entrada de código ou na entrada de pseudocódigo da propriedade guard. Obviamente, o guarda” else ” faz sentido apenas para um pseudoestado de escolha com vários segmentos de escolha de saída.

nota Durante a geração de código, o else guard sempre será gerado por último dentro do grupo de todos os guardas associados ao mesmo pseudoestato de escolha, independentemente de sua ordem no Model Explorer.

segmentos de escolha sem else

de acordo com a especificação UML, um evento que não pode ser processado devido a todos os guardas que avaliam FALSE deve ser tratado como não processado, o que significa que deve ser propagado para o(s) superestado (s). Esse requisito tem implicações para pseudoestados de escolha sem um segmento else explícito. Especificamente, para cumprir a semântica UML, o gerador de código qm™ gerará em tais casos um ramo implícito else que causará a propagação do evento para o(s) superestado (s).

observe que há uma diferença entre um pseudostato de escolha com um segmento else vazio e um pseudostato de escolha idêntico sem o segmento else. O else vazio explícito fará com que o evento seja consumido (sem fazer nada), enquanto a ausência do segmento else fará com que o evento se propague para o(s) superestado (s).

ordem de Avaliação da Guarda

a especificação UML exige que as condições de guarda anexadas ao mesmo pseudoestato de escolha sejam mutuamente complementares, de modo que a ordem de avaliação dos guardas não importa. Embora manter os guardas complementares ainda seja recomendado no QM™, a ferramenta avalia os guardas sempre na ordem predeterminada, na qual você pode confiar.

a ordem de avaliação da Guarda é determinada pela Ordem dos itens do segmento de escolha no Model Explorer. Esta ordem pode ser alterada por meio dos botões para cima e para baixo na barra de ferramentas do Explorer. Alternativamente, o Item atual pode ser movido para cima ou para baixo dentro do Model Explorer por meio dos atalhos de teclado: Ctrl-(key-up) e Ctrl-(key-down).

Nota Em caso de sobreposição de guardas quando a ordem de avaliação da Guarda é importante, é altamente recomendável organizar os segmentos de escolha graficamente no diagrama na mesma ordem que no Model Explorer, conforme ilustrado na captura de tela acima. O código gerado seguirá a mesma ordem, conforme mostrado à direita do diagrama acima.

avaliação da ordem de ação

quaisquer segmentos de escolha anexados a uma transição adicionam as ações do segmento de escolha à ação realizada pela transição. A ordem de avaliação de todas essas ações é intuitiva e começa sempre com a ação de transição executada incondicionalmente, seguida pela avaliação condicional das ações do segmento de escolha.

por exemplo, a ordem de avaliação da ação no diagrama acima é resumida pelo seguinte pseudocódigo:

. . .
caso TRIG: {
/* ação de transição… * /
action0 (); / * executado incondicionalmente */
/* segmentos de escolha… * /
if (g1()) {
action1();
. . .
}
mais se (g2()) {
action2();
. . .
}
mais {
. . .
}
}
. . .

segmentos de escolha aninhados

conforme descrito acima, os segmentos de escolha podem aninhar. Isso permite que você construa caminhos de transição condicionais complexos, mas como sempre com guardas, o recurso não deve ser usado em excesso.

Por exemplo, um erro comum é usar profundamente aninhadas escolha de segmentos de escolher entre um número de possíveis caminhos de transição (ver o painel (A) no diagrama abaixo):

melhor e muito mais simples alternativa é a utilização de múltipla escolha segmentos ligados à mesma escolha pseudostate, como mostrado no painel (B) no diagrama acima.

Nota Lembre-se de que você pode anexar muitos segmentos de escolha a uma determinada transição. Um diagrama com menor número de pseudoestatos de escolha (diamantes) é um diagrama melhor e mais fácil de entender. Atenção o gerador de código qm ™ limita o número de níveis de aninhamento no código a 16 (incluindo as funções de aninhamento dentro do manipulador de Estado). O uso de segmentos de escolha profundamente aninhados pode facilmente exceder esse limite.

segmentos de escolha de roteamento

uma transição com segmentos de múltipla escolha, alguns deles potencialmente aninhados, agrupa muitos elementos em um pequeno espaço de diagrama. Para reorganizar graficamente uma “bola de conectores” tão complexa, você precisa estar ciente das regras básicas que se aplicam nessa situação.

a primeira regra é que antes que você possa alterar a forma de qualquer elemento, primeiro você precisa selecioná-lo.

por exemplo, se você quiser mover a escolha-pseuodstate( o diamante), você precisa clicar na transição de entrada original para a escolha-pseudoestate. Pleease note que você especificamente não deve clicar na forma de diamante em si, porque na verdade é uma coleção sobreposta do transion-end de entrada mais todos os segmentos de estrangulamento de saída, por isso é ambíguo qual forma você realmente quer dizer. Em vez disso, você deve clicar em um dos segmentos de transição ou no início da transição. (NOTA: Você também pode selecionar inequivocamente qualquer item de modelo na visualização Model Explorer). A animação a seguir ilustra o processo:

por outro lado, se você selecionar um segmento de escolha de saída, não poderá mover o pseudoestado de escolha. Em vez disso, agora você pode mover apenas o segmento de escolha selecionado para anexá-lo novamente em outro lugar.

Leave a Reply