2017-02-21 39 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我想我會選擇點的方法。似乎更容易理解,如果不是簡單就是用圖表對某些東西進行可視化後的想法:) –