2017-02-21 40 views
1

我正在使用UML状态图建模一个进程。下面是一些伪代码,确定当前状态:如何使用状态图模拟此过程?

function getAccountState(customer) { 

    if (authorizationRequired(customer)) { 
     return State.AUTHORIZATION_REQUIRED 
    } 

    if (updateRequired(customer)) { 
     return State.UPDATE_REQUIRED 
    } 

    return State.DRAFT 
} 

我得到的最接近是此图: State diagram

不过,我认为这是有些奇怪,每个过渡包含两次。这个顺序很重要,但是这意味着,授权检查应该始终在第一位。

如何将这一过程中的一个模式?

编辑:

这个过程背后的背景是一个REST服务。该帐户被建模为一个资源,可以通过各种状态。任何时候请求资源时,服务都按上述伪代码所描述的顺序执行检查,以生成相应的表示。根据不同的答案,它包括两种:

  • 链接到授权帐户如果帐户需要授权
  • 一个链接,如果需要更新,以更新的姿态(然而,这可能只有一次的帐户是发生授权或没有被授权)
  • 的链接完成帐户概况是否跟上时代的(可能是因为它不得不进行更新,并通过客户端更新,或者从来没有在被更新第1名)

上面的代码只是一个examp尽管如此。该服务还可以利用存储“状态”的数据库字段,虽然这是一种反模式不是?通过对存储的数据应用业务规则而不是(冗余地)将状态存储在单独的字段中来“派生”当前状态是更加可行的。这就是伪代码应该表明的内容。

+0

你的代码并不代表一个状态机。目前尚不清楚auth-needed/upd.-req如何。操作影响整个系统。你也不能从一开始就转移两次。这将采取未确定/随机路径, –

+0

代码应该表示“活动”状态的规则。例如。创建帐户时,该方法会被调用并可能会返回该帐户需要授权才能继续。在此操作(例如授权)之后,该方法会再次被调用,并且可能会返回需要更新配置文件的情况。如果没有,该帐户处于草稿状态。代码只能代表这个逻辑,这个代码在某些系统中并不存在。我只是想说明规则。 –

+0

是的,我知道。但它只是返回操作返回的条件。这根本不是一台状态机。这只是一个简单的操作,返回一个条件值,意外命名为“状态”。 –

回答

0

根据您的编辑,我会想出以下办法:

enter image description here

您将通过(可选)授权和更新达到Draft状态。如果失败,状态机将重置。

0

我想提出一点关于“每次转换都包含两次都有点奇怪”的说法,我明白从一个状态你可以有几次由同一事件触发的转换,但在这种情况下,转换有不同的看守。我记得,这个符号是evt [guard]。希望这个帮助。

+0

这是一个有趣的方法。问题是主要表达条件(使用UML表示法)还是作为转换的守护者更好。什么时候使用什么建议? –

+0

根据这个问题(http://stackoverflow.com/questions/5724259/state-transition-with-different-guard-condition)使用警卫实际上是要走的路。另外,接受答案中的链接示例将讨论两种或两种以上状态的选择。布尔选择当然可以符合这个条件,但是在这里,警卫被明确地设计来处理布尔选择似乎更合适。 –

+0

我只是试图模拟使用守卫:http://imgur.com/hFlOazC我想我会选择点的方法。似乎更容易理解,如果不是简单就是用图表对某些东西进行可视化后的想法:) –