您好、欢迎来到现金彩票网!
当前位置:彩之网 > 状态转移图 >

状态图的提示与技巧

发布时间:2019-06-27 01:15 来源:未知 编辑:admin

  当给定一项选择时,要使用状态机的可视语义,而不要写出详细的转移代码。例如,不要用几个信号触发一个转移,然后使用详细代码来管理以不同的方式依赖于信号的控制流。应使用由单独的信号来触发的单独转移。在隐藏了附加行为的转移代码中,要避免使用条件逻辑。

  根据在状态期间等待的事件或正在发生的事件来命名状态。记住,状态不是“时间点”;它是状态机等待某个事件发生的时间段。例如,“waitingForEnd”这一名称比“end”更好;“timingSomeActivity”比“timeout”更好。不要让状态的名称看起来象是操作名。

  谨慎使用状态变量;不要在创建新状态时使用它们。如果状态不多,很少带有或不带有依赖于状态的行为,并且很少有或根本没有可能与包含状态机的封装体并行或独立的行为,就可以使用状态变量。如果有复杂的、依赖于状态的潜在并行行为,或者如果必须处理的事件可能来自于包含状态机的封装体之外,则应考虑使用构件封装体。

  如果单个图中的状态超过 5 * 2 个,就应考虑使用子状态。在这里可以应用我们的常识:在一个非常规则的模式中可以有十个状态,但如果两个状态之间具有四十个转移,显然就需要重新考虑了。务必要使状态机易于理解。

  使用触发事件的事件和/或在转移期间发生的事件为转移命名。选择更加易于理解的名称。

  当您看见一个选择点时,应考虑是否可以将作出该选择的职责委托给另一个构件,以便将其作为一组将不同的信号提供给封装体遵照执行(例如,代替对消息-数据 x 的选择),并考虑是否可以让发送方或另一中间主角来作出决定,然后通过在信号名称中明确显示该决定的方式发送信号(例如,使用名为 isFull 和 isEmpty 的信号,而不是以值命名信号并检查消息数据)。

  在任何给定的封装体中,尽量使选择点名称保持唯一(其原因与转移名称需保持唯一相同)。

  转移的代码段是否太长?是否应使用函数来代替它们,是否将常用代码段记录为函数?转移应该类似于高层的伪代码,并且应当遵循与 C++ 函数相同或更严格的长度规则。例如,代码超过 25 行的转移可被认为是过长。

  要特别注意进入和退出操作:在进行更改后忘记更改相应进入和退出操作的情况尤其容易发生。

  退出操作可用于提供安全性功能,例如,从“heaterOn”状态中的退出操作将关闭加热器,在这里,操作被用来强制执行一个断言语句。

  通常,除非状态机是抽象的并且将由包含元素的子类来进行改进,否则子状态应包含两个或更多个状态。

  应该用选择点来代替操作或转移中的条件逻辑。选择点容易被看到,而代码中的条件逻辑则是不可见的,很容易被忽略。

  如果事件触发了几个转移,将无法控制首先对哪个警戒条件求值。这会产生无法预料的结果。

  可能有多个警戒条件为“True”,但随后只能有一个转移。所选择的路径是无法预料的。

  通过使用紧密耦合的数据类和封装体类来对数据类建模(例如,数据类用于向四周传递类型信息,但封装体类包含了应与数据类相关联的大部分数据)。

  在某些情况下没有循环的状态机。在流程控制应用程序中,或者在试图控制一个事件序列时,这样的状态机是有效的;如果它们在分析过程中出现,则表示状态机已退化为流程图。

  抽象状态机是需要添加更多细节才能实际使用的状态机。抽象状态机可用于定义可复用的一般行为,这些行为将在随后的模型元素中得到进一步的改进。请考虑图 5 中的抽象状态机。例如,图 5 中的简单状态机代表了实时系统中许多不同元素类型的最抽象的行为(自动“控制”)。尽管不同的元素类型都具有这一最高抽象程度,但是,根据其目的,它们可能在“Running”状态中具有非常不同的详细行为。因此,该状态机最有可能在某个抽象封装体类中定义,该封装体类被用作不同的专用封装体类的根类。

  因此,我们将使用继承来定义该抽象状态机的两种不同的改进形式。图 6 显示了这两种改进形式 R1 和 R2。为清晰起见,我们使用浅灰笔来描绘从父类继承而来的元素。

  这两种改进形式的明显差异在于它们分解“Running”(正在运行)状态的方式,以及它们扩展原“start”(开始)转移的方式。当然,只有当改进形式已知,因而未在抽象类中使用单个端到端转移来实施时,才能作出这些选择。

http://pepdeco.com/zhuangtaizhuanyitu/94.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有