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

Uml 如何使用枚举值作为状态图状态?,uml,Uml,我希望状态图状态是给定枚举类型的值。在第二步中,我想使用状态图作为前面提到的枚举类型属性的约束,例如,在属性的setter中作为参数检查。枚举属性在UML中表示如下: _______________________ | <<enumeration>> | | DaysOfTheWeek | |_____________________| | Sunday | | Monday | | Tuesday

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

枚举属性在UML中表示如下:

_______________________
|   <<enumeration>>   |
|    DaysOfTheWeek    |
|_____________________|
| Sunday              |
| Monday              |
| Tuesday             |
| ...                 |
|_____________________|
_______________________
|      |
|星期一|
|_____________________|
|星期天|
|星期一|
|星期二|
| ...                 |
|_____________________|
然后,您可以在枚举和状态图之间绘制关联


希望这有帮助

枚举属性在UML中表示如下:

_______________________
|   <<enumeration>>   |
|    DaysOfTheWeek    |
|_____________________|
| Sunday              |
| Monday              |
| Tuesday             |
| ...                 |
|_____________________|
_______________________
|      |
|星期一|
|_____________________|
|星期天|
|星期一|
|星期二|
| ...                 |
|_____________________|
然后,您可以在枚举和状态图之间绘制关联


希望这对您有所帮助

我不知道您的具体实现,但我会将您重定向到状态机模式,这是实现状态机的一种非常优雅的方式。Cf,维基百科页面:
我不知道您的具体实现,但我会将您重定向到状态机模式,这是实现状态机的一种非常优雅的方式。Cf,维基百科页面:

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

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

仍然不能确定我是否完全理解您试图实现的目标。然而,这里有一些想法,希望它们有用。如果我没抓住要点,我道歉

第一个问题是:为什么希望枚举值和状态同构?从最普遍的意义上讲,这就是复制信息。而且复制的信息有一个不同步的习惯。因此,了解动机是很有用的

尽管如此,这里还是有一些可能性

1。UML/建模透视图

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

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

即使您没有使用可执行的UML概要文件(或类似文件),将上述内容作为规则/约定来陈述也是完全有效的。如果有必要,您可以定义自己的配置文件,尽管这可能有点过分——这取决于您的环境

关键的一点是,枚举在建模世界中是不必要的

2。代码透视图

在将模型转换为代码时,枚举是定义当前状态变量类型的一种合理且常用的方法。根据建模场景,您希望将
current_state
属性设置为外部世界只读。然后,您还需要三件事:

  • 状态机的一种实现
  • 驱动状态机的每个事件的公共成员函数
  • 一个私有成员函数,用于从状态机实现中更新
    当前_状态
    变量
  • 因此,在代码世界中,您可以通过将
    当前_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)有很好的概述;(2) 和(3)包括在内

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


    嗯。

    我仍然不确定我是否完全理解你想要实现的目标。然而,这里有一些想法,希望它们有用。如果我没抓住要点,我道歉

    第一个问题是:为什么希望枚举值和状态同构?从最普遍的意义上讲,这就是复制信息。而且复制的信息有一个不同步的习惯。因此,了解动机是很有用的

    尽管如此,这里还是有一些可能性

    1。UML/建模透视图

    在UML世界中,不需要同时拥有一个状态模型和一个与之关联的枚举。UML通常不定义如何读取对象当前状态的值;但是,某些配置文件(例如)确实如此。在前