書(shū)名: UiPath RPA開(kāi)發(fā):入門(mén)、實(shí)戰(zhàn)與進(jìn)階作者名: 邵京京等本章字?jǐn)?shù): 2464字更新時(shí)間: 2021-08-06 14:57:27
2.1.3 狀態(tài)機(jī)
狀態(tài)機(jī)(State Machine)也是一種工作流類(lèi)型,它相當(dāng)于一個(gè)獨(dú)立的模塊,里面包含一個(gè)或多個(gè)實(shí)現(xiàn)了相對(duì)獨(dú)立功能的Flowchart和Sequence。
State Machine中的一個(gè)重要概念是轉(zhuǎn)換(Transition)。Transition由箭頭或者狀態(tài)之間的分支來(lái)表示,它可以添加從一種狀態(tài)跳轉(zhuǎn)到另一種狀態(tài)的條件。因此某種程度上,State Machine可以看作是帶有條件的Flowchart,適合實(shí)現(xiàn)復(fù)雜的企業(yè)化流程。
與Sequence和Flowchart不同,State Machine強(qiáng)調(diào)事件驅(qū)動(dòng)和在不同狀態(tài)之間自由流轉(zhuǎn)。它總是停在一個(gè)預(yù)設(shè)的狀態(tài)中,直到事件觸發(fā)之后才會(huì)跳轉(zhuǎn)到新的狀態(tài)上,可前進(jìn)到下一狀態(tài),可返回到上一狀態(tài),也可停留在當(dāng)前活動(dòng)內(nèi)反復(fù)執(zhí)行某一操作。
State Machine中存在唯一的開(kāi)始節(jié)點(diǎn),且只有兩個(gè)Activity可以使用,分別是狀態(tài)(State)和最終狀態(tài)(Final State),狀態(tài)間可以有一個(gè)或多個(gè)分支。在State Machine中添加狀態(tài),在不同的狀態(tài)中放置不同的操作流程,并設(shè)置Transition中的觸發(fā)器(Trigger)為下一個(gè)狀態(tài)添加觸發(fā)器。執(zhí)行時(shí)一旦滿(mǎn)足Trigger中的觸發(fā)條件,State Machine就會(huì)執(zhí)行下一個(gè)狀態(tài)對(duì)應(yīng)的操作。
圖2-27是一個(gè)State Machine的項(xiàng)目主界面。在初始狀態(tài)中會(huì)打開(kāi)一個(gè)網(wǎng)址并進(jìn)行登錄,如果登錄成功會(huì)進(jìn)行數(shù)據(jù)處理,如果登錄失敗則會(huì)提示錯(cuò)誤信息。在數(shù)據(jù)處理時(shí),如果處理成功會(huì)進(jìn)行數(shù)據(jù)記錄,如果處理失敗則會(huì)提示錯(cuò)誤信息。大家可以先對(duì)這個(gè)案例有個(gè)簡(jiǎn)單的印象,接下來(lái)會(huì)詳細(xì)介紹State Machine的每個(gè)部分,并配合實(shí)例來(lái)幫助理解。

圖2-27 State Machine示例
State和Final State這兩個(gè)活動(dòng)都可以通過(guò)雙擊展開(kāi)來(lái)查看更多信息并進(jìn)行編輯。其中,State活動(dòng)包括3個(gè)部分,即Entry(入口)、Exit(出口)和Transition(s)(轉(zhuǎn)換),如圖2-28所示。Entry和Exit用于為所選狀態(tài)添加進(jìn)入和退出狀態(tài)時(shí)要執(zhí)行的活動(dòng),而Transition(s)則顯示連接到所選狀態(tài)的所有轉(zhuǎn)換。
當(dāng)我們雙擊Transition時(shí),Transition會(huì)被展開(kāi),就像State活動(dòng)一樣。它包含3個(gè)部分:Trigger(觸發(fā)器)、Condition(條件)和Action(操作),用于為下一個(gè)狀態(tài)添加觸發(fā)器,或者添加要執(zhí)行活動(dòng)的條件,如圖2-29所示。

圖2-28 State示例

圖2-29 Transition示例
而Final State活動(dòng)中只有一個(gè)部分,即Entry,用于為所選狀態(tài)添加進(jìn)入狀態(tài)時(shí)要執(zhí)行的活動(dòng),如圖2-30所示。

圖2-30 Final State示例
在實(shí)際項(xiàng)目中使用State Machine時(shí)需要注意,官方要求只能創(chuàng)建一個(gè)初始狀態(tài),但可以有多個(gè)最終狀態(tài),我們可以通過(guò)在Transition中添加不同的條件來(lái)實(shí)現(xiàn)數(shù)據(jù)的傳遞以及自動(dòng)化流程的切換。
我們以公司的采購(gòu)流程為例:首先提交采購(gòu)申請(qǐng)至項(xiàng)目審批,當(dāng)采購(gòu)金額小于等于1000美元時(shí),如果項(xiàng)目審批通過(guò)則將成功信息錄入系統(tǒng)等待采購(gòu),如果項(xiàng)目審批失敗則將失敗信息錄入系統(tǒng)。當(dāng)項(xiàng)目審批通過(guò)且付款金額大于1000美金時(shí),需繼續(xù)將采購(gòu)申請(qǐng)?zhí)峤恢敛块T(mén)審批,如果部門(mén)審批通過(guò)則將成功信息錄入系統(tǒng)等待采購(gòu),如果部門(mén)審批失敗則將失敗信息錄入系統(tǒng)。這個(gè)需求對(duì)于不同的采購(gòu)金額、審批狀態(tài)會(huì)有不同的操作指示,下一個(gè)狀態(tài)是相對(duì)不固定的,因此使用State Machine可以輕松實(shí)現(xiàn)。
【例2.3】使用State Machine完成猜測(cè)數(shù)字小游戲。我們會(huì)創(chuàng)建一個(gè)項(xiàng)目,它會(huì)自動(dòng)生成一個(gè)1~100之間的隨機(jī)數(shù),并彈出窗口提示用戶(hù)來(lái)猜測(cè)這個(gè)隨機(jī)數(shù)。如果用戶(hù)猜測(cè)的數(shù)字不正確,則提示用戶(hù)猜大了或者是猜小了,請(qǐng)用戶(hù)重新猜測(cè);如果用戶(hù)猜測(cè)的數(shù)字正確,則提示用戶(hù)猜測(cè)正確并結(jié)束游戲。流程圖如圖2-31所示。

圖2-31 流程圖
具體實(shí)現(xiàn)步驟如下所示。
1)進(jìn)入Studio界面,點(diǎn)擊Process創(chuàng)建一個(gè)新流程,命名為2_3_State Machine,如圖2-32所示。
2)點(diǎn)擊DESIGN選項(xiàng)卡中的New按鈕,選擇State Machine工作流,如圖2-33所示。
3)在彈出對(duì)話框中將新創(chuàng)建的State Machine工作流命名為StateMachine,而后點(diǎn)擊Create按鈕,如圖2-34所示。

圖2-32 新建流程

圖2-33 新建State Machine

圖2-34 命名創(chuàng)建的State Machine
4)在Variables面板中創(chuàng)建兩個(gè)簡(jiǎn)單數(shù)字類(lèi)型變量:GuessNumber和RandomNumber。第一個(gè)變量用于存儲(chǔ)猜測(cè)的數(shù)字,第二個(gè)變量用于存儲(chǔ)生成的隨機(jī)數(shù),如圖2-35所示。

圖2-35 創(chuàng)建變量
5)在Activities面板的搜索框內(nèi)輸入state,如圖2-36所示。

圖2-36 搜索State活動(dòng)
6)將State活動(dòng)拖入StateMachine狀態(tài)機(jī)中,連接至Start節(jié)點(diǎn),用于生成隨機(jī)數(shù)字,如圖2-37所示。

圖2-37 拖入State活動(dòng)
7)雙擊State活動(dòng)使其展開(kāi),在Properties面板中,更改DisplayName屬性為“生成隨機(jī)數(shù)字”,如圖2-38所示。

圖2-38 展開(kāi)State活動(dòng)并更改屬性
8)在Activities面板的搜索框內(nèi)輸入assign,如圖2-39所示。

圖2-39 搜索Assign活動(dòng)
9)將Assign活動(dòng)拖入State活動(dòng)的Entry部分。在Properties面板中,在Assign活動(dòng)的To屬性中寫(xiě)入RandomNumber變量,在Value屬性中寫(xiě)入new random().next(1,100),用于將生成的隨機(jī)數(shù)存儲(chǔ)在RandomNumber變量中,如圖2-40所示。

圖2-40 生成隨機(jī)數(shù)字
10)回到主項(xiàng)目視圖,再拖入一個(gè)State活動(dòng),將其連接到先前添加的活動(dòng),如圖2-41所示。

圖2-41 拖入State活動(dòng)
11)雙擊State活動(dòng)使其展開(kāi),在Properties面板中,更改DisplayName屬性為“猜測(cè)數(shù)字”,如圖2-42所示。

圖2-42 展開(kāi)State活動(dòng)并更改屬性
12)拖入一個(gè)Input Dialog活動(dòng)到State活動(dòng)的Entry部分。在Properties面板中,更改Label屬性為“"請(qǐng)輸入一個(gè)整數(shù):"”,更改Title屬性為“"輸入數(shù)字"”,并在Result屬性中寫(xiě)入GuessNumber變量,用于存儲(chǔ)用戶(hù)猜測(cè)的數(shù)字,如圖2-43所示。

圖2-43 拖入Input Dialog活動(dòng)并更改屬性
13)回到主項(xiàng)目視圖,創(chuàng)建一個(gè)“猜測(cè)數(shù)字”狀態(tài)指向自身的轉(zhuǎn)換,如圖2-44所示。
14)雙擊該轉(zhuǎn)換使其展開(kāi),在Properties面板中,更改DisplayName屬性為數(shù)字過(guò)小(此文字也會(huì)顯示在主項(xiàng)目視圖的箭頭上),在Condition條件中寫(xiě)入GuessNumber<RandomNumber,用于判斷猜測(cè)的數(shù)字是否比生成的隨機(jī)數(shù)小,如圖2-45所示。
15)在Action部分拖入一個(gè)Message Box活動(dòng),輸入“"您猜測(cè)的數(shù)字過(guò)小,請(qǐng)重新猜測(cè)。"”,如圖2-46所示。

圖2-44 創(chuàng)建轉(zhuǎn)換

圖2-45 展開(kāi)轉(zhuǎn)換并更改屬性

圖2-46 猜測(cè)數(shù)字過(guò)小時(shí)彈出窗口設(shè)置
16)回到主項(xiàng)目視圖,創(chuàng)建一個(gè)“猜測(cè)數(shù)字”狀態(tài)指向自身的轉(zhuǎn)換,如圖2-47所示。

圖2-47 創(chuàng)建轉(zhuǎn)換
17)雙擊該轉(zhuǎn)換使其展開(kāi),在Properties面板中,更改DisplayName屬性為“數(shù)字過(guò)大”(此文字也會(huì)顯示在主項(xiàng)目視圖的箭頭上),在Condition條件中寫(xiě)入GuessNumber>RandomNumber,用于判斷猜測(cè)的數(shù)字是否比生成的隨機(jī)數(shù)大,如圖2-48所示。

圖2-48 展開(kāi)轉(zhuǎn)換并更改屬性
18)在Action部分拖入一個(gè)Message Box活動(dòng),輸入“"您猜測(cè)的數(shù)字過(guò)大,請(qǐng)重新猜測(cè)。"”,如圖2-49所示。

圖2-49 猜測(cè)數(shù)字過(guò)大時(shí)彈出窗口設(shè)置

圖2-50 搜索Final State活動(dòng)
19)回到主項(xiàng)目視圖,在Activities面板的搜索框內(nèi)輸入final state,如圖2-50所示。注:State Machine中必須要有Final State活動(dòng),否則State Machine將無(wú)法結(jié)束。
20)將Final State活動(dòng)拖入StateMachine中,創(chuàng)建一個(gè)“猜測(cè)數(shù)字”狀態(tài)指向Final State的轉(zhuǎn)換,如圖2-51所示。

圖2-51 拖入Final State活動(dòng)并創(chuàng)建轉(zhuǎn)換
21)雙擊該轉(zhuǎn)換使其展開(kāi),在Properties面板中,更改DisplayName屬性為“猜測(cè)正確”(此文字也會(huì)顯示在主項(xiàng)目視圖的箭頭上),在Condition條件中寫(xiě)入GuessNumber=RandomNumber,用于判斷猜測(cè)是數(shù)字是否等于生成的隨機(jī)數(shù),如圖2-52所示。

圖2-52 展開(kāi)轉(zhuǎn)換并更改屬性
22)回到主項(xiàng)目視圖,雙擊Final State使其展開(kāi),在Entry部分拖入一個(gè)Message Box活動(dòng),輸入“"恭喜您,猜測(cè)正確!"”,如圖2-53所示。

圖2-53 猜測(cè)正確時(shí)彈出窗口設(shè)置
23)最終主項(xiàng)目視圖如圖2-54所示。
24)按F6鍵執(zhí)行流程,系統(tǒng)將顯示“輸入數(shù)字”對(duì)話框,如圖2-55所示。

圖2-54 最終主項(xiàng)目視圖
25)當(dāng)猜測(cè)的數(shù)字過(guò)小時(shí)執(zhí)行結(jié)果如圖2-56所示,當(dāng)猜測(cè)的數(shù)字過(guò)大時(shí)執(zhí)行結(jié)果如圖2-57所示,當(dāng)猜測(cè)的數(shù)字正確時(shí)執(zhí)行結(jié)果如圖2-58所示。

圖2-55 “輸入數(shù)字”對(duì)話框

圖2-56 數(shù)字過(guò)小時(shí)的執(zhí)行結(jié)果

圖2-57 數(shù)字過(guò)大時(shí)的執(zhí)行結(jié)果

圖2-58 數(shù)字正確時(shí)的執(zhí)行結(jié)果
- Instant Testing with CasperJS
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- Oracle從新手到高手
- Azure IoT Development Cookbook
- Python進(jìn)階編程:編寫(xiě)更高效、優(yōu)雅的Python代碼
- C語(yǔ)言程序設(shè)計(jì)案例式教程
- Java持續(xù)交付
- 自然語(yǔ)言處理Python進(jìn)階
- Python Data Structures and Algorithms
- Mastering Akka
- 軟件測(cè)試教程
- 軟件項(xiàng)目管理實(shí)用教程
- R Data Science Essentials
- 30天學(xué)通C#項(xiàng)目案例開(kāi)發(fā)
- Python機(jī)器學(xué)習(xí)開(kāi)發(fā)實(shí)戰(zhàn)