当 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 时,它正确吗? 的相关文章

  • “包含”、“扩展”和“使用”之间有什么区别?

    在用例图中 两者有什么区别 lt
  • 生成随机确定性有限自动机的算法是什么?

    DFA 必须具有以下四个属性 DFA 有 N 个节点 每个节点有 2 个传出转换 每个节点都可以从其他每个节点访问 从所有可能性中以完全一致的随机性选择 DFA 这是我到目前为止所拥有的 从 N 个节点的集合开始 选择一个尚未选择的节点 将
  • 用例图包括

    我有一个关于用例图的问题 如图所示 用户可以输入或更新他的姓名和问题 正如您所看到的 用户在第一次输入信息时需要输入姓名和问题 因此包括在内 但是 如果他希望更新他的信息 图表是否表明他必须修改名称和问题 因为它们包含在内 例如 如果他拼错
  • 类图转换为关系模型;继承和匹配表

    对于一个学校项目 我应该设计上学期项目的系统 我们使用 UML 创建一个极其简单的用例图 没有 lt
  • 如何在 UML 中指定“一次一个”?

    我正在制作一个类图Classroom and a Course class 我怎样才能表明Classroom只能有一个Course一次在其中吗 我知道我可以使用多重性来指定教室可以只开设一门课程 但这并不能完全指定在不同时间可以有除该一门课
  • 如何在 UML 活动图上显示异步操作

    我即将绘制 记录一些客户端 服务器连接建立代码 以更好地理解它 有几个操作是在单独的线程中异步完成的 连接线程 数据接收线程等 我应该在单独的图表上显示它们吗 我更愿意将其放在单个图表上以掌握整体视图 但不知道如何在活动图上表示它 我不确定
  • 聚合、组合、关联、直接关联

    我正在复习面向对象编程方面的知识 在类之间的关系主题下 我遇到了一些对我来说有点模糊的关系 我知道依赖项 uses a 和继承 is a 但我对聚合 组合 关联和直接关联有点不熟悉 另外 其中哪一个是 has a 关系 有些可以与关联互换使
  • 如何用UML表示通信协议?

    在我的 UML 模型中 我有一个系统及其相互通信的子组件 例如 我有一台计算机和一个遥控机器人 它们通过蓝牙进行通信 目前图中的流程类似于 计算机 触发 遥控车 的 setVelocity 函数 在这一点上 我想通过说以下的话来完善沟通 计
  • 如何为“转换”状态机定义触发器的枚举?

    作为不相关的后续这个答案 https stackoverflow com a 68269299 913098 它使用以下工作代码 from transitions import Machine from transitions import
  • 访谈:函数指针与 switch case

    在面试期间 我被要求为具有 100 个状态的系统实现一个状态机 其中每个状态又具有 100 个事件 我回答了以下 3 种方法 if else 开关盒 函数指针 if else 显然不适合这样的状态机 因此主要比较是 switch case
  • UML三元关联实现java代码[重复]

    这个问题在这里已经有答案了 三元关联是结构关系 指定一个事物的对象连接到其他两个事物的对象 我理解这种关系 但我不知道如何实现显示这三个类之间关联的方法 让我们考虑下面的例子 项目有许多使用特定编程的开发人员 语言促进发展 开发人员使用特定
  • UML状态图中守卫和事件的区别

    我以为我可以区分event and guard 但我遇到了一个与守卫类似的事件 counter gt 4 pin is high switch on event 我将变量计数器从小于 4 的某个值更改为大于 4 的值作为事件 这是否意味着事
  • 如何在 UML 中正式记录 C# 属性?

    在 UML 类图中记录类的 C 属性的正确方法是什么 我还没有决定这是否是我的答案 但我想我会把它扔在那里以便讨论 这看起来可以接受吗 它是属性类型的实例 其中元数据值放入下面的标记值中 我刚刚弄清楚如何添加自定义立体类型 该箭头只是一个标
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • UML 图 - 在我的应用程序中发送电子邮件被视为外部系统

    我的应用程序有一个联系选项 它将打开带有按摩页面的电子邮件应用程序 并且消息接收者设置为应用程序支持电子邮件 我已附上我的意思的图片 我已将其编写为需求 但不确定如何在系统类图和用例图中说明它 我最初在用例图中所做的是 将我的用户 主要参与
  • 用例 - 帮助 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是编写用例的新手 我听说用例是非技术表达 我有以下任务 我必须为其编写用例 我降低了对你理解的要求 ABC公司的注册客户使用凭据登录系统以检索
  • 聚合多重性 UML

    我和我的同事在某一点上无法达成一致 在 UML 中 当进行聚合时 菱形边重数最大为 1 或者可以是 0 吗 还是取决于某种观点 先感谢您 首先 您需要具体说明您指的是哪个 钻石 作为空钻石聚合填充钻石是作品 如果你的意思是空钻石 那么 Ic
  • Android Studio 上的代码 Iris 插件

    我正在尝试使代码 iris 插件在 Android studio 上工作 我按右键单击 gt 创建代码虹膜图 然后我收到一条通知 表明我的图表已准备就绪 但我不知道该图何时存储 创建的文件的名称是什么以及如何打开它 有任何想法吗 CODE
  • Eclipse Papyrus 上的 OCL 约束检查

    有人设法检查在 Eclipse Papyrus 中建模的类图上的 OCL 约束吗 我定义了一个简单的测试配置文件 对构造型属性只有一个约束 OCL self property gt 0 构造型扩展了 Property 元类 因此我将其应用于
  • 如何使用机器学习从数据序列计算状态图?

    通用配方 我有一个由一系列点组成的数据集 每个点有 12 个特征 我有兴趣检测此数据中的事件 在训练数据中我知道事件发生的时刻 当事件发生时 我可以在事件发生之前的点序列中看到可观察到的模式 该形态由大约 300 个连续点形成 我感兴趣的是

随机推荐

  • 在 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