当 BoUML 的状态机生成器在退出 StateMachine 状态之前调用 doActivity 时,它正确吗?

2024-01-14

考虑一个简单的状态机:

下面是由以下代码生成的 C++ 代码片段BoUML https://www.bouml.fr/index.html从中:

 // to manage the event create
 void Sample::Sample_State::State1_State::create(Sample & stm) {
         _doentry(stm);
 }

 // perform the 'entry behavior'
 void Sample::Sample_State::State1_State::_doentry(Sample & stm) {
   stm.enter_state1();
 }

 // perform the 'exit behavior'
 void Sample::Sample_State::State1_State::_doexit(Sample & stm) {
   stm.exit_state1();
 }

 // perform the 'do activity'
 void Sample::Sample_State::State1_State::_do(Sample & stm) {
   stm.do_state1();
 }

 // to manage the event exit_state1
 void Sample::Sample_State::State1_State::exit_state1(Sample & stm) {
     _do(stm);
     {
       stm._sample_state._state1_state._doexit(stm);
       stm._set_currentState(stm._sample_state);
       stm._final();
     }
 }

注意_do(stm)被称为Sample::Sample_State::State1_State::exit_state1(Sample & stm),即在退出状态 1 时,就在调用退出行为之前stm._sample_state._state1_state._doexit(stm);

UML规范 https://www.omg.org/spec/UML/About-UML/告诉我们:

14.2.3.4.3 状态进入、退出和 doActivity 行为

. . .

状态也可能有关联的 doActivity 行为。该行为在进入状态时开始执行(但仅在状态进入行为完成后),并与可能与该状态关联的任何其他行为同时执行,直到:

  • 它完成(在这种情况下生成完成事件)或
  • 状态被退出,在这种情况下 doActivity 行为的执行被中止。

状态的 doActivity 行为的执行不受该状态的内部转换触发的影响。

调用不是更符合UML规范吗_do(stm) from Sample::Sample_State::State1_State::create(),紧接着_doentry(stm);?


In fact it is worst, I exchanged the management of the do behavior between the entry and exit cases. Considering that state machine (the transitions from a state to itself are internal) : enter image description here

和主要的

int main()
{
  MM mm;
  
  mm.create();

  cout << endl << "fire taa" << endl;
  mm.taa();

  cout << endl << "fire tab" << endl;
  mm.tab();

  cout << endl << "fire tbb" << endl;
  mm.tbb();

  cout << endl << "fire tba" << endl;
  mm.tba();

  cout << endl << "fire tdone" << endl;
  mm.tdone();
}

编译(不定义VERBOSE_STATE_MACHINE)和执行:

pi@raspberrypi:~/sm/src $ g++ -Wall -g MM.cpp mmain.cpp 
pi@raspberrypi:~/sm/src $ ./a.out
a entry

fire taa
a do
taa

fire tab
a do
a exit
tab expr
b entry

fire tbb
b do
tbb

fire tba
b do
b exit
tba expr
a entry

fire tdone
a do
a exit
tdone
pi@raspberrypi:~/sm/src $ 

So the 做行为为内部转换执行,退出状态时错误,进入状态时丢失。

请注意状态机发电机是plug-out它的定义是 BoUML 通过项目交付的一部分sm_生成器,它是用 C++(而不是 Java)实现的。这样就可以加载项目了sm_生成器,保存为您有写入权限的地方,更正它,生成C++代码,编译它并用您的新版本替换官方生成器或声明您的新版本plug-out并将其关联到状态机将其添加到菜单中。


我修改了我的状态机发生器,上一次是在2011年!

The 做行为退出状态时不再执行,包括通过自我外部转换,现在在可能的情况之后执行do entry。我还在自我内部转换的可能转换行为之后(而不是之前)执行此操作,这样可以避免两次连续执行,而在转换具有行为的情况下,中间没有任何内容。

请注意,已经可以执行可能的操作做行为通过操作当前状态做活动定义在与机器关联的类上。这允许在过渡触发之间进行此操作。

与之前的状态机稍微修改一下添加一个自我外部转变 :

然后main

#include "MM.h"
#include <iostream>
using namespace std;

int main()
{
  MM mm;
  
  mm.create();

  cout << endl << "fire taa" << endl;
  mm.taa();

  cout << endl << "fire ta_a" << endl;
  mm.ta_a();

  cout << endl << "fire tab" << endl;
  mm.tab();

  cout << endl << "fire tbb" << endl;
  mm.tbb();

  cout << endl << "fire tba" << endl;
  mm.tba();

  cout << endl << "fire tdone" << endl;
  mm.tdone();
}

编译(不定义VERBOSE_STATE_MACHINE)和执行:

pi@raspberrypi:~/sm/src $ g++ -Wall MM.cpp mmain.cpp 
pi@raspberrypi:~/sm/src $ ./a.out
a entry
a do

fire taa
taa expr
a do

fire ta_a
a exit
ta_a expr
a entry
a do

fire tab
a exit
tab expr
b entry
b do

fire tbb
tbb expr
b do

fire tba
b exit
tba expr
a entry
a do

fire tdone
a exit
tdone expr
pi@raspberrypi:~/sm/src $ 

BoUML 7.10 https://www.bouml.fr/historic.html可用并解决问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 BoUML 的状态机生成器在退出 StateMachine 状态之前调用 doActivity 时,它正确吗? 的相关文章

  • 用例之间的 UML 关系(扩展/包含)

    我不太理解以下主题 因为它与我读到的内容有点含糊 Inlcude就像对下一部分的引用一样 没有它 用例就不完整 这部分应该从更多地方引用 否则它的使用没有意义 但我见过一个例子 其中 include 仅在某些 IF 语句中为真 例如 添加新
  • 类图转换为关系模型;继承和匹配表

    对于一个学校项目 我应该设计上学期项目的系统 我们使用 UML 创建一个极其简单的用例图 没有 lt
  • 如何在 UML 属性中指定枚举文字作为默认值?

    我目前使用 EMF UML Implementation 进行一些模型转换 在我的模型转换中 我创建了一个具有一些属性的 uml 类 这些属性是我也创建的枚举类型 某些属性应该获得默认值 默认值应该是枚举文字 现在的问题是 如何将枚举文字获
  • uml 与 RDF 和 OWL 的组合关系

    我是 RDF 和 OWL 本体的初学者 我正在尝试将此图转换为 OWL 语法
  • UML 领域建模

    领域模型和数据模型有什么区别 数据模型是一个design仅描述数据及其关系的模型 该模型包含实体 但它们是根据什么来描述的data他们不负责如何处理这些数据或他们的责任是什么 另一方面 领域模型是用于分析问题领域的概念模型 它用具有关系 数
  • Haskell 中的有限自动机

    在 Haskell 中表示有限自动机的好方法是什么 它的数据类型是什么样的 在我们学院 自动机被定义为 5 元组 Q X delta q 0 F 其中 Q 是自动机状态的集合 X 是字母表 这部分是否必要 delta 是从 Q X 获取 2
  • 有人可以给出pluginaweek - statemachine 的活动记录示例吗?

    有人可以举一个简单的例子来说明如何使用插件周状态机 https github com pluginaweek state machine对于具有活动记录的票证模型 我不明白文档中的复杂示例 示例说明 新 gt 接受 拒绝 反馈 已接受 gt
  • 如何在 UML 类图中表示“事件”?

    这是我的代码片段 public class Notation INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged private N
  • Eclipse:如何安装 UML2 工具

    我想尝试 UML2 Tools for Eclipse 如图所示本教程 http www vogella de articles UML article html 我目前拥有面向 Java EE 开发人员的 Eclipse 3 6 Heli
  • 如何在 Windows 上使用 Pyreverse

    我想使用pyreverse 创建图表类 我下载它 当我使用这个命令时 pyreverse bat c PyreverseCommand a1 s1 f ALL o png test py 我收到错误 名称 点 无法识别 什么是 点 如何创建
  • UML 到 Java 代码生成工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用pluginaweek的state_machine,我可以在事件期间引用activerecord对象吗?

    我正在尝试实现一个 挂起 事件 将对象转换为 挂起状态 但我需要能够 取消暂停 并返回到之前的状态 我向模型添加了 previous state 字段 但我看不到如何在事件块内访问它 这是我试图实现的基本逻辑 event suspend d
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra
  • 是否可以在 UML 中可视化一堆函数

    我正在改进一个使用类和函数文件 只是包含各种函数的 php 文件 的内容管理系统 例如 我有一堂课叫Admin以及一个功能文件 其功能包括显示管理员概述 创建新管理员 编辑现有管理员 删除管理员 函数文件使用类并执行 mvc 概念的可视化部
  • 有什么办法可以自动生成UML图吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 MySQL 数据库 我想生成它的关系图 有没有一个工具可以连接到数据库并自动为我生成它 是的
  • UML 只能用于面向对象吗?

    目前 在我的论文期间 存在着关于 UML 是否仅用于 OO 开发 的激烈争论 我从一些来源进行了搜索 其中给出了很多关于它的论点 就我自己而言 我相信并非所有 UML 图都是专门为 OO 系统 软件开发而制作的 即 状态图 因此 我希望得到
  • UML 中的 IsRoot、IsAbstract 和 IsLeaf 何时使用?

    我遇到了以下描述IsRoot IsAbstract IsLeaf但不明白你什么时候会使用它们 摘自http www2 sys con com itsg virtualcd dotnet archives 0108 clark index h
  • 系统间依赖关系的UML图

    哪种 UML 图最能显示我们的 IT 系统和其他外部 IT 系统之间的依赖关系 例如我想在图表上显示 系统A从系统B获取数据 系统B可以调用系统A的一些功能 我想知道组件图和序列图之间的关系 你怎么认为 你的问题不是很具体 因为所有 UML
  • UML 状态机,本地转换与外部转换

    正如已经问过的http www eclipse org forums index php t 452409 http www eclipse org forums index php t 452409 我不确定我是否正确理解了本地转换的含义
  • 如何模拟非确定性有限换能器?

    只需跟踪自动机所处的状态以及它在输入字符串中的位置 就可以在输入字符串上轻松模拟非确定性自动机 但是 如何模拟非确定性传感器 当然 传感器可以将输入符号转换为输出符号 并给出字符串作为输出 而不仅仅是布尔值 这似乎更复杂 因为我们需要以某种

随机推荐

  • 在 swift 3 iOS 中实现谷歌翻译 api

    你好 我是 iOS 开发新手 我正在尝试在我的应用程序中实现谷歌翻译 API 我从GitHub上在线找到了一些示例代码https github com prine ROGoogleTranslate https github com pri
  • 无法更改 rgl 图中的文本大小

    我在更改使用 rgl 包生成的 3d 绘图的文本大小时遇到 问题 一切工作正常 但我无法有效地更改 3d 对象的 cex 属性 我在 64 位 Ubuntu 10 04 LTS 2 6 32 37 generic 下运行 R 2 14 1
  • 构造函数中的同步以使其发生在之前

    我有一个关于如何通过 Java 内存模型保证对象是线程安全的问题 我读过很多文章 说在构造函数中编写同步作用域没有意义 但为什么没有意义呢 是的 确实 只要正在构造的对象不在线程之间共享 这不应该是 除了构造线程之外 没有任何线程可以到达任
  • 与 ARM LDR 指令关联的哈希 (#) 值是什么意思?

    我正在尝试调试我的应用程序中遇到的崩溃 堆栈跟踪指向具有以下格式的 LDR 指令 感谢反汇编程序 LDR R3 R0 4 我的问题是关于源组件的 第二个参数中的 4是什么意思 我假设它是某种偏移量 但我还没有找到支持 LDR 指令的文档 它
  • DataTable 和线程安全

    我将 DataTable 存储在 ASP NET Cache 属性中 可以对该 DataTable 执行的操作有 绑定到网格控件 第 3 方网格内部管理数据源对象 回发后其 DataSource 为 NULL 我假设一旦绑定数据 它就不再使
  • MavenProject:获取在我的插件上使用的可用类

    我正在按照描述加载 Maven 项目here https stackoverflow com questions 4381460 get mavenproject from just the pom xml pom parser 我正在尝试
  • 定期分割字符串

    我想定期分割字符串 我的问题与这个问题几乎相同 如何将一个字符串分割成给定长度的子串 https stackoverflow com questions 11619616 how to split a string into substri
  • SubSonic 和存储过程

    使用 SubSonic 时 您是否将数据作为数据集返回 或者将其放入强类型自定义集合或通用对象中 我运行了 subsonic 项目 对于数据库中的四个存储过程 它为我提供了一个 Sps cs 其中包含 4 个返回 StoredProcedu
  • 如何访问数组的对象(stdClass 对象)成员/元素的属性? [复制]

    这个问题在这里已经有答案了 Doing print r 在我的阵列上我得到以下信息 Array 0 gt stdClass Object id gt 25 time gt 2014 01 16 16 35 17 fname gt 4 tex
  • 双除法的错误行为

    我有一个HashMap called List
  • 如何在 Antd 表中使用 Radio 组?

    我想这样做 每一行都是一个Radio组 每个单元格都是一个Radio按钮 如图 Radio 组的示例如下
  • python中的循环引用

    我不确定python如何处理循环引用 引用循环 我检查了一些答案并发现this https stackoverflow com questions 8025888 does python gc deal with reference cyc
  • Android - 返回调用 Activity

    来自 iPhone 开发人员的新手问题 我已调用 startActivity intent 并加载新活动 按下按钮后如何 返回 调用活动 基本上将活动从堆栈中 弹出 如果您使用以下命令创建了新活动startActivity http dev
  • Camel从类路径资源读取文件?

    我在 Spring Boot 应用程序的 resources file txt 的类路径上有一个文件 我如何在骆驼路线中引用它 我努力了 from file resource classpath fileName file txt 及其变体
  • 死代码识别(C++)

    我有一个在 Visual Studio 2008 下编译的大型遗留 C 项目 我知道有相当数量的 死 代码无法在任何地方访问 未调用的方法 未使用的整个类 我正在寻找一个可以通过以下方式识别这一点的工具静态分析 这个问题 遗留 C C 项目
  • iOS 企业部署:单击 itms-services 链接会导致“无法连接到 [domain]”错误

    为了部署企业 iOS 应用程序 我创建了以下链接 未编码版本 为了方便阅读 a href Download a 编码版本 a href Download a 正如所讨论的 链接已正确编码here https stackoverflow co
  • FindBugs 引发了一个由 Array 引起的名为 EI_EXPOSE_REP 的错误

    FindBugs 提出了一个名为 EI EXPOSE REP 的错误 其描述如下 EI 可以通过返回对可变对象的引用来公开内部表示 返回对存储在对象字段之一中的可变对象值的引用会公开该对象的内部表示形式 如果实例由不受信任的代码访问 并且对
  • 不推荐使用的元素会从未来的浏览器中删除吗?

    使用有什么缺点不推荐使用的元素 http www evotech net blog 2007 07 xhtml deprecated elements and attributes 如果我不关心验证并且使用支持它们的 DTD 未来的浏览器不
  • 如何使 Bootstrap 轮播滑块使用手机左/右滑动

    演示JSFiddle http jsfiddle net KY5Tu 1 div class col md 4 div class carousel slide ol class carousel indicators grey li cl
  • 当 BoUML 的状态机生成器在退出 StateMachine 状态之前调用 doActivity 时,它正确吗?

    考虑一个简单的状态机 下面是由以下代码生成的 C 代码片段BoUML https www bouml fr index html从中 to manage the event create void Sample Sample State S