【UiPath】謎技術State machineに挑戦だ①

※今回の記事はState machineを勉強しながら書いてるので、内容がいきあたりばったりです。
整理された結論だけを知りたい方は[次回②](https://qiita.com/UmegayaRollcake/items/7056043afe9348994d11)を見て下さい。

UiPathでワークフローを組むためのアクティビティはSequence, Flowchart, State machineの３種類。
縦に流れるSequenceとフローチャート型のFlowchartは直感的で理解しやすいのですが、
最後のState machine（ステートマシン）だけはAcademyにも登場しないので全く素性がわからない。

UiPath Studioガイドの[ステートマシン](https://studio.uipath.com/docs/state-machines)を見ても、
> ステートマシンはオートメーションの一種で、実行中に有限個の状態を使用します。
> ステートマシンは、アクティビティによって起動されたときに、ある状態に移行することができ、
> 別のアクティビティが起動されたときにその状態を終了します。

**なるほど、わからん。**
とはいえ、せめて使い道だけでも押さえておきたいので
実際に挑戦してState machineがどんなものかを理解したいと思います。

# まずやってみる。
### State machine, State, Final state
公式ドキュメント読んでもさっぱり理解できないので、まずは手を動かす！
Blank projectに"State Machine"アクティビティを置き、その中に"State"アクティビティを置く。
　![state.png](https://qiita-image-store.s3.amazonaws.com/0/255097/10950fc8-e414-8720-f08d-17e998696256.png)

![init.png](https://qiita-image-store.s3.amazonaws.com/0/255097/28cd9d1a-4d9d-f82f-03c6-32f9c2967a20.png)

警告メッセージには「State 'Init state' must have at least 1 transition.」とあるので、
Stateの中を開けると・・・あった、transition(s)。ココに何か設定すればいいのね。
　![init2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/91cdac87-160f-112c-46e2-03d26e1a7433.png)

（ｶﾁｶﾁｶﾁｶﾁ）うお～、transition(s)を何度クリックしても何も設定できない！
おとなしくUiPath Studioガイドに戻ると
> トランジションも State アクティビティとまったく同様に、ダブルクリックすると展開されます。
> トランジションには [Trigger]、[Condition]、[Action] の 3 つのセクションがあり、

だから仰せの通りダブルクリックしても何も展開されないんだって！
仕方がないので放っておいて、もう１つのアクティビティ"Final state"を置いて線でつないでみる。
![final_activity.png](https://qiita-image-store.s3.amazonaws.com/0/255097/e361db81-e193-3a3a-a77c-714bd426f0bd.png)
![final1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/3254f6f6-82ac-c55f-4635-68bf6bda65ab.png)

**エラー消えた！**　あとなんだ"T1"って。Transition(s)のTか？
さっきのStateに戻ってみると
　![trans1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/c831f308-4752-dc11-564d-12e975149733.png)
**transition(s)増えてる！**
そうか、transition =「遷移」だから、次につながる（=遷移先の）Stateがあれば勝手に生成されるのか。
だんだんわかってきた。

### transition(s)の設定
で、遷移T1をクリックするとガイドの言う通り[Trigger]、[Condition]、[Action] の３セクションが登場。
![trans_internal.png](https://qiita-image-store.s3.amazonaws.com/0/255097/bc1290f0-1ebe-6a05-7e65-821c20e47f3e.png)

TriggerかConditionのどちらかにFinalStateへ遷移する条件を書けばいいんだな。
（ちなみにどちらにも書かない場合は即座にFinalStateへ遷移する）

①まずはTriggerをやってみる。↓の例だと、マウス左クリックされるまでじっと待って、
クリックされたらEvent handrer実行して（＝メッセージ表示して）FinalStateへ遷移する。
※RepearForeverオプションをFalseにするのを忘れずに
![trigger1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/bfbbac56-f1aa-52fe-2d71-20d1322b7775.png)

②うまくいったので次はCondition。
↓の例だと、今が６月であればAction実行して（＝メッセージ表示して）FinalStateへ遷移する。
 ![condition1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/8b462ad2-4769-4c35-ab92-3647eb23eb96.png)

・・・となると、６月じゃない場合、つまりConditionに該当しない場合はどうなっちゃうの？

**→ 出口が無いから詰まります。**ずっと実行中のままで先に進まないのね。

### Stateの追加
Conditionに該当しない場合の出口として、もう１つFinalStateを置いて、線でつないでみる。
![sin-final1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/794345ef-6bfe-212a-1050-eafcf3f9f36c.png)

自動的にT2ができた。
![trans2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/2e81af09-20fd-f693-2eb4-f3931c9ec8a8.png)

でも警告メッセージには
「Trigger-less transaction 'T2' of state 'Init state' must contain a condition.
　A state can only have one unconditional transaction that has no trigger.」

なるほど、T2側にも何かConditionを設定しなきゃダメなのか。
Else的な「T1じゃなかったらT2」という解釈は勝手にしてくれないのね。
という事は、**Conditionに抜け漏れが無いかをしっかり確認しないと詰まるリスクがある**な・・・

というわけでT2にもConditionを設定。
![T2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/83322bb7-2c81-3b51-1937-d6181c3a70ae.png)

これで詰まらないState machineが完成しました。

---
今回はここまで。
非常に単純なワークフローですが、StateとTransition(Trigger/Condition)に触れる事で、
State machineがどのようなもので、関係するアクティビティの意味や使い方が理解できました。
次回②までに情報を整理して、「結局State machineとはこういうものです」と説明できるようにします。