如何使用枚举值作为状态图状态?

时间:2011-11-15 14:41:07

标签: uml

我希望状态图状态为给定枚举类型的值。在第二步中,我想使用状态图作为前面提到的枚举类型的属性的约束,例如,作为参数检查属性的setter。

4 个答案:

答案 0 :(得分:0)

枚举属性以UML表示,如下所示:

_______________________
|   <<enumeration>>   |
|    DaysOfTheWeek    |
|_____________________|
| Sunday              |
| Monday              |
| Tuesday             |
| ...                 |
|_____________________|

然后你可以在枚举和状态图之间绘制一个关联。

希望这有帮助

答案 1 :(得分:0)

我不了解您的详细实现,但我会将您重定向到状态机模式,这是一种实现状态机的非常优雅的方式。维基百科页面: http://en.wikipedia.org/wiki/State_pattern

答案 2 :(得分:0)

在某些工具中,您可以点击枚举&gt;创建状态图。这意味着状态图将在UML模型树中的枚举的根处创建。因此状态图将具有枚举属性。

答案 3 :(得分:0)

仍然不确定我完全明白你想要实现的目标。然而,这里有一些想法,希望它们有用。抱歉,如果我错过了这一点。

第一个问题是:为什么你想要枚举值和状态是同构的?在最普遍的意义上,它是复制信息。复制的信息有一种不同步的习惯。因此理解动机会很有用。

尽管如此,这里有几种可能性。

<强> 1。 UML /建模视角

在UML世界中,没有必要同时拥有状态模型和与之关联的枚举。 UML一般不定义如何读取对象当前状态的值;但是某些配置文件(例如Executable UML)可以。在Executable UML中,任何具有状态机的类都会自动获取名为current_state的只读属性。 current_state的可能值是状态模型中状态的名称。因此,您可以将其视为定义隐式枚举的状态机。

请注意,该属性是只读的。这是因为改变它的唯一方法是通过状态机,即通过向对象发送事件。所以它也满足了你的第二个要求:不可能以违反状态机协议的方式更改current_state变量的值。

即使您没有使用可执行UML配置文件(或类似),将上述规则/约定说明也是完全有效的。如果有必要,你可以定义自己的个人资料,虽然这可能是过度的 - 取决于你的情况。

关键是建模领域不需要枚举。

<强> 2。代码视角

将模型转换为代码时,枚举是定义当前状态变量类型的明智且常用的方法。根据建模方案,您需要将current_state属性仅读取到外部世界。然后你需要另外三件事:

  1. 状态机的实现
  2. 驱动状态机的每个事件的公共成员函数
  3. 用于从状态机实现中更新current_state变量的私有成员函数。
  4. 因此,在代码世界中,您可以通过将current_state变量仅读取到外部世界来阻止它的无效序列。也就是说,您只有一个公共读访问器:没有公共写访问器。

    在类中,您将写访问器设置为私有,并确保它被调用的唯一位置是在状态机实现中。

    您可以提供与驱动状态机的事件相对应的公共方法,而不是公共写入访问器。关于在下面实现状态机的更多细节,但现在这是一个简单的例子:

    class Phone {
    
        enum PhoneState {disconnected, connecting, connected, disconnecting};
    
        public PhoneState current_state {get};  //no write accessor
    
        //functions for generating state machine events
        public void digit(int number) {..}      //press digit key, e.g. while dialing
        public void connect() {..}    //make connection
        public void disconnect() {..} //disconnect
    }
    

    实施状态机

    实现状态机有3种常见模式: 1.状态矩阵或查找表 2.嵌套交换机 3.状态模式

    对(1)here有一个很好的概述; (2)&amp; (3)涵盖here

    基本上就是这样。我不完全确定你回答了你的问题。如果不是道歉,也许你可以更具体地了解你想要实现的目标。

    第h