在学习Thinking in Patterns chapter 18: Complex system states中的StateMachine的前半部分时(TIPatterns.htm#_Toc41169779),与我原来看那本System Analysis and Design中文译本中的UML建模中的状态图作了一下比较。发现二者有比较大的区别,故把状态图的有关知识再复习了一下。
下面是我在网上搜索到的一篇讲述UML状态图的文章,其中对状态图的基本定义和它在实际应用中的示例和原则都作了详细的阐述。不过比较长,而且是翻译过来的,很不好理解。尤其是前半部分讲基础概念的,更是模模糊糊的。我根据自己的需要,把上面的内容摘录了一些提纲性的东西备用。
一、基础部分
状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的时间做出反应的。通常我们创建一个UML状态图是为了以下的研究目的:研究类、角色、子系统、或组件的复杂行为。
状态机由状态组成,各状态由转移链接在一起。状态是对象执行某项活动或等待某个事件时的条件。转移是两个状态之间的关系,它由某个事件触发,然后执行特定的操作或评估并导致特定的结束状态。图 1 描绘了状态机的各种元素。
状态机的要素:(图 1:状态机符号。)
状态的要素:
名称: 将一个状态与其他状态区分开来的文本字符串;状态也可能是匿名的,这表示它没有名称。 进入/退出操作: 在进入和退出状态时所执行的操作。 内部转移: 在不使状态发生变更的情况下进行的转移。 子状态: 状态的嵌套结构,包括不相连的(依次处于活动状态的)或并行的(同时处于活动状态的)子状态。 延迟的事件: 未在该状态中处理但被延迟处理(即列队等待由另一个状态中的对象来处理)的一系列事件。
| |
转移的要素:
源状态: 转移所影响的状态;如果对象处于源状态,当对象收到转移的触发事件并且满足警戒条件(如果有)时,就可能会触发输出转移。 事件触发器: 使转移满足触发条件的事件。当处于源状态的对象收到该事件时(假设已满足其警戒条件),就可能会触发转移。 警戒条件: 一种布尔表达式。在接收到事件触发器而触发转移时,将对该表达式求值;如果该表达式求值结果为 True,则说明转移符合触发条件;如果该表达式求值结果为 False,则不触发转移。如果没有其他转移可以由同一事件来触发,该事件就将被丢弃。 操作: 可执行的、不可分割的计算过程,该计算可能直接作用于拥有状态机的对象,也可能间接作用于该对象可见的其他对象。 目标状态: 在完成转移后被激活的状态。
| |
二、应用示例部分(结合示例讲了画状态图的一些准则):
我觉得文中的这个示例太好了,值得经常看看。
1、通用准则
1.1)、当行为的改变和状态有关时才创建状态图。
敏捷建模( AM) ( Ambler 2002)的原则--最大化项目干系人的投资--建议你只有当模型能够提供正面价值的时候才创建模型。
图⒈班级注册的一个UML状态图。
1.2)、把初始状态放置在左上角。
1.3)、把最终状态放置在右下角。
2、状态指南
状态是一个实体的行为模式的某个阶段。 状态的表示是通过实体的属性值。
2.1)、状态名称要简单但应具有描述性。
2.2)、避免”黑洞”状态。
2.3)、避免”奇迹”状态。
3、子状态建模指南
3.1)、为复杂的目标建模子状态。
图⒉Seminar的完整生命周期
3.2)、把通用的子状态变换放在一起
3.3)、为复杂的实体创建一个分层的状态图
图⒊Seminar的高阶状态图。
3.4)、最高阶的状态图总有初始态和最终态
4、变换和动作
变换是从一种状态到另一种状态的序列,它可能是通过一个事件触发的。
4.1)、用实现语言的命名规则命名软件动作
4.2)、只有对所有的入口变换都合适时才注明入口动作
4.3)、只有对所有的出口变换适合时才注明出口动作
4.4)、出口动作,用exit/标记来表示,工作方式类似于入口动作。
4.5)、只有当你想终止并再进入该状态时才建模递归变换
4.6)、用过去式命名转换事件
4.7)、把转换标记放在接近源状态的地方
4.8)、以转换方向为基础放置变换标记
4.9)、为了更易于判断哪个标记和变换是一起的,按照如下的规则来放置变换标记:
4.9.1)、在变换线条上的从左到右。
4.9.2)、在变换线条下的从右到左。
4.9.3)、变换线条右边的往下。
4.9.4)、变换线条左边的往上。
5、警戒点
一个警戒点是为了穿过一个转换而必须为真的一个条件。
5.1)、警戒点不应该重叠
5.2)、为可视化的定位警戒点而引入接合点。
5.3)、警戒点不必配套
5.4)、一致的命名警戒点
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
摘录完毕
在学习Thinking in Patterns chapter 18: Complex system states中的StateMachine的前半部分时(TIPatterns.htm#_Toc41169779),与我原来看那本System Analysis and Design中文译本中的UML建模中的状态图作了一下比较。发现二者有比较大的区别,故把状态图的有关知识再复习了一下。下面是我在网上搜索到的一篇讲述UML状态图的文章,其中对状态图的基本定义和它在实际应用中的示例和原则都作了详细的阐述。不过比较长,而且是翻译过来的,很不好理解。尤其是前半部分讲基础概念的,更是模模糊糊的。我根据自己的需要,把上面的内容摘录了一些提纲性的东西备用。一、基础部分 状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的时间做出反应的。通常我们创建一个UML状态图是为了以下的研究目的:研究类、角色、子系统、或组件的复杂行为。 状态机由状态组成,各状态由转移链接在一起。状态是对象执行某项活动或等待某个事件时的条件。转移是两个状态之间的关系,它由某个事件触发,然后执行特定的操作或评估并导致特定的结束状态。图 1 描绘了状态机的各种元素。 状态机的要素:(图 1:状态机符号。) 状态的要素:名称: 将一个状态与其他状态区分开来的文本字符串;状态也可能是匿名的,这表示它没有名称。 进入/退出操作: 在进入和退出状态时所执行的操作。内部转移: 在不使状态发生变更的情况下进行的转移。子状态: 状态的嵌套结构,包括不相连的(依次处于活动状态的)或并行的(同时处于活动状态的)子状态。延迟的事件: 未在该状态中处理但被延迟处理(即列队等待由另一个状态中的对象来处理)的一系列事件。 转移的要素:源状态: 转移所影响的状态;如果对象处于源状态,当对象收到转移的触发事件并且满足警戒条件(如果有)时,就可能会触发输出转移。 事件触发器: 使转移满足触发条件的事件。当处于源状态的对象收到该事件时(假设已满足其警戒条件),就可能会触发转移。警戒条件: 一种布尔表达式。在接收到事件触发器而触发转移时,将对该表达式求值;如果该表达式求值结果为 True,则说明转移符合触发条件;如果该表达式求值结果为 False,则不触发转移。如果没有其他转移可以由同一事件来触发,该事件就将被丢弃。操作: 可执行的、不可分割的计算过程,该计算可能直接作用于拥有状态机的对象,也可能间接作用于该对象可见的其他对象。目标状态: 在完成转移后被激活的状态。二、应用示例部分(结合示例讲了画状态图的一些准则): 我觉得文中的这个示例太好了,值得经常看看。1、通用准则 1.1)、当行为的改变和状态有关时才创建状态图。 敏捷建模( AM) ( Ambler 2002)的原则--最大化项目干系人的投资--建议你只有当模型能够提供正面价值的时候才创建模型。 图⒈班级注册的一个UML状态图。 1.2)、把初始状态放置在左上角。 1.3)、把最终状态放置在右下角。2、状态指南 状态是一个实体的行为模式的某个阶段。 状态的表示是通过实体的属性值。 2.1)、状态名称要简单但应具有描述性。 2.2)、避免”黑洞”状态。 2.3)、避免”奇迹”状态。3、子状态建模指南 3.1)、为复杂的目标建模子状态。图⒉Seminar的完整生命周期 3.2)、把通用的子状态变换放在一起 3.3)、为复杂的实体创建一个分层的状态图图⒊Seminar的高阶状态图。 3.4)、最高阶的状态图总有初始态和最终态4、变换和动作 变换是从一种状态到另一种状态的序列,它可能是通过一个事件触发的。 4.1)、用实现语言的命名规则命名软件动作 4.2)、只有对所有的入口变换都合适时才注明入口动作 4.3)、只有对所有的出口变换适合时才注明出口动作 4.4)、出口动作,用exit/标记来表示,工作方式类似于入口动作。 4.5)、只有当你想终止并再进入该状态时才建模递归变换 4.6)、用过去式命名转换事件 4.7)、把转换标记放在接近源状态的地方 4.8)、以转换方向为基础放置变换标记 4.9)、为了更易于判断哪个标记和变换是一起的,按照如下的规则来放置变换标记: 4.9.1)、在变换线条上的从左到右。 4.9.2)、在变换线条下的从右到左。 4.9.3)、变换线条右边的往下。 4.9.4)、变换线条左边的往上。5、警戒点 一个警戒点是为了穿过一个转换而必须为真的一个条件。 5.1)、警戒点不应该重叠 5.2)、为可视化的定位警戒点而引入接合点。 5.3)、警戒点不必配套 5.4)、一致的命名警戒点×××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 摘录完毕