「 👆 この空っぽの紙を ステート ダイアグラム(状態遷移図; State Diagram)と呼ぶとしようぜ、まだ何も書いてないけど」
「 UML の State diagram は学習コストがかかるのよねえ」
「 👆 UMLと違って、入り口は 紙の端っこから入ってくる線にしようぜ。
矢印を描くのも めんどくさい。角丸の四角形から ちょっと離れている線は 矢印が刺さっているとしようぜ」
「 ログインしたからといって、 ログドイン とは限らないじゃない。
条件分岐が欲しくなるのよ」
「 👆 じゃあ Ok
と Fail
に分岐するとしようぜ。
紙の端っこに向かっている ちょっと離れている線は 出口 としようぜ?」
「 👆 UML図では Choice Pseudo-State(選択疑似状態)と呼んでいるが、
名前が長いんで単に Choice と呼ぼうぜ?」
「 角丸の正方形と、塗りつぶした菱形は 視覚的に違うが 実装上はどちらも ステートだと思ってくれだぜ」
「 その Choice は、 紙の外に属しているの? LoggedInステート に属しているの? それとも独立しているの?」
「 このダイアグラムの境界線を Borderステート と呼ぶことにして、
その Borderステートは Loginエッジを持っているとして、
その Loginエッジは Choice(ひし形)を持っているということにしようぜ?」
BorderState:
LoginEdge:
LoginChoice:
OkEdge:
FailEdge:
LoggedInState:
[Border]
--Login--
<Login>
--Ok--
--Fail--
[LoggedIn]
「 👆 LoggedInステートは 名無しのひげ が1本伸びていて ひし形に向かっているとしようぜ?」
「 👆 代わりに LoggedInチョイスの方から たくさん ひげ が伸びているんだぜ」
[LoggedIn]
----
<LoggedIn>
--GameId--
--EndGameSummary--
--Start--
--Turn--
--MyTurn--
--StartPosTurn--
--BeginPosRow--
--Unknown--
「 👆 お父んが思っているよりも多くの ひげ が生えてるぜ」
「 👆 Startエッジの先に Gameステートが生えてるとしようぜ?」
「 👆 Gameステートからは、 Moveエッジ、 Winエッジ、 Loseエッジ が生えてると思ってくれだぜ」
「 ステート と チョイス の使い分けが分からんな。 どっちも ステートだし」
「 👆 ここで 最初に戻って、 エッジには コールバック関数 を置けるものとするぜ。
ここでは login_choice.on_ok
と login_choice.on_fail
といった感じだぜ」
「 👆 このダイアグラムで使う変数は Context(コンテキスト)みたいな名前の変数1つに全部入れて どのステートからでもアクセスしろだぜ。
オブジェクト指向の流儀から外れるかもしれないが、
ステート、そのうちお前の前に 何百、何千と 山ほど現れるんで 管理が嫌になる」
「 コンテキストの中に State(ステート)も入れないのかだぜ?」
「 コンテキストが 空っぽでも このダイアグラムは動くように 作ってほしい。
ダイアグラムを動かすために必要なものを コンテキストに入れないでほしい」
「 じゃあ、ダイアグラムは コンテキストの内容を 知らんということか」
def leave(self, context, line):
"""辺の名前を返します
Returns
-------
str
辺の名前
"""
return "--Ok--"
「 👆 今居るステート(またはチョイス)から生えている エッジ の名前を返す操作を、
専門用語が無いんで 仮に リーブ (去る;Leave) と呼ぶことにしようぜ?」
「 エッジは何本も有ったりするだろ。どのエッジを返すんだぜ?」
「 その判断は leave
にお任せだぜ。
context
、または line
という入力値から判断されるものとするぜ」
「 今去ったステートと、今辿っているエッジの名前の2つがあれば、
次のステートの名前は出てくるだろうから、専門用語が無いんで仮に アライブ(到着する;Arrive)と呼ぶことにしようぜ?」
mapping.py:
connection_dict = {
"<Login>.--OK--": "[LoggedIn].<LoggedIn>",
"<Login>.--Fail--": None,
}
「 👆 前の文字列をキーにして、後ろの1つが出てくるようにすればいいな」
self._state_creators = {
"": self.create_login_choice, # 初期値
"[Login].<Login>": self.create_login_choice,
"[LoggedIn].<LoggedIn>": self.create_logged_in_choice,
"[Game]": self.create_game_state
}
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!