State Diagram Programming (非UML)

げほ(^~^) 公開下書き

20211124blog244.png

ramen-tabero-futsu2.png
「 👆 この空っぽの紙を ステート ダイアグラム(状態遷移図; State Diagram)と呼ぶとしようぜ、まだ何も書いてないけど」

kifuwarabe-futsu.png
「 ナン(None)ステート ダイアグラム」

ohkina-hiyoko-futsu2.png
「 UML の State diagram は学習コストがかかるのよねえ」

20211124blog245.png

ramen-tabero-futsu2.png
「 👆 UMLと違って、入り口は 紙の端っこから入ってくる線にしようぜ。
矢印を描くのも めんどくさい。角丸の四角形から ちょっと離れている線は 矢印が刺さっているとしようぜ」

ohkina-hiyoko-futsu2.png
「 ログインしたからといって、 ログドイン とは限らないじゃない。
条件分岐が欲しくなるのよ」

20211124blog246.png

ramen-tabero-futsu2.png
「 👆 じゃあ OkFail に分岐するとしようぜ。
紙の端っこに向かっている ちょっと離れている線は 出口 としようぜ?」

ohkina-hiyoko-futsu2.png
「 その ひし形は何なの?」

ramen-tabero-futsu2.png
「 👆 UML図では Choice Pseudo-State(選択疑似状態)と呼んでいるが、
名前が長いんで単に Choice と呼ぼうぜ?」

ramen-tabero-futsu2.png
「 角丸の正方形と、塗りつぶした菱形は 視覚的に違うが 実装上はどちらも ステートだと思ってくれだぜ」

ohkina-hiyoko-futsu2.png
「 その Choice は、 紙の外に属しているの? LoggedInステート に属しているの? それとも独立しているの?」

ramen-tabero-futsu2.png
「 このダイアグラムの境界線を Borderステート と呼ぶことにして、
その Borderステートは Loginエッジを持っているとして、
その Loginエッジは Choice(ひし形)を持っているということにしようぜ?」

BorderState:
    LoginEdge:
        LoginChoice:
            OkEdge:
            FailEdge:

LoggedInState:

kifuwarabe-futsu.png
「 👆 こんな構成か」

[Border]
    --Login--
        <Login>
            --Ok--
            --Fail--

[LoggedIn]

ramen-tabero-futsu2.png
「 👆 雰囲気を出してみようぜ?」

20211124blog247.png

ramen-tabero-futsu2.png
「 👆 LoggedInステートは 名無しのひげ が1本伸びていて ひし形に向かっているとしようぜ?」

20211124blog248.png

ramen-tabero-futsu2.png
「 👆 代わりに LoggedInチョイスの方から たくさん ひげ が伸びているんだぜ」

[LoggedIn]
    ----
        <LoggedIn>
            --GameId--
            --EndGameSummary--
            --Start--
            --Turn--
            --MyTurn--
            --StartPosTurn--
            --BeginPosRow--
            --Unknown--

kifuwarabe-futsu.png
「 👆 お父んが思っているよりも多くの ひげ が生えてるぜ」

20211124blog249.png

ramen-tabero-futsu2.png
「 👆 Startエッジの先に Gameステートが生えてるとしようぜ?」

20211124blog250.png

ramen-tabero-futsu2.png
「 👆 Gameステートからは、 Moveエッジ、 Winエッジ、 Loseエッジ が生えてると思ってくれだぜ」

kifuwarabe-futsu.png
「 ステート と チョイス の使い分けが分からんな。 どっちも ステートだし」

20211124blog251a1.png

ramen-tabero-futsu2.png
「 👆 ここで 最初に戻って、 エッジには コールバック関数 を置けるものとするぜ。
ここでは login_choice.on_oklogin_choice.on_fail といった感じだぜ」

コンテキスト

20211124blog252.png

ramen-tabero-futsu2.png
「 👆 このダイアグラムで使う変数は Context(コンテキスト)みたいな名前の変数1つに全部入れて どのステートからでもアクセスしろだぜ。
オブジェクト指向の流儀から外れるかもしれないが、
ステート、そのうちお前の前に 何百、何千と 山ほど現れるんで 管理が嫌になる」

kifuwarabe-futsu.png
「 コンテキストの中に State(ステート)も入れないのかだぜ?」

ramen-tabero-futsu2.png
「 コンテキストが 空っぽでも このダイアグラムは動くように 作ってほしい。
ダイアグラムを動かすために必要なものを コンテキストに入れないでほしい」

kifuwarabe-futsu.png
「 じゃあ、ダイアグラムは コンテキストの内容を 知らんということか」

リーブ

    def leave(self, context, line):
        """辺の名前を返します
        Returns
        -------
        str
            辺の名前
        """
        return "--Ok--"

ramen-tabero-futsu2.png
「 👆 今居るステート(またはチョイス)から生えている エッジ の名前を返す操作を、
専門用語が無いんで 仮に リーブ (去る;Leave) と呼ぶことにしようぜ?」

kifuwarabe-futsu.png
「 エッジは何本も有ったりするだろ。どのエッジを返すんだぜ?」

ramen-tabero-futsu2.png
「 その判断は leave にお任せだぜ。
context、または line という入力値から判断されるものとするぜ」

アライブ

ramen-tabero-futsu2.png
「 今去ったステートと、今辿っているエッジの名前の2つがあれば、
次のステートの名前は出てくるだろうから、専門用語が無いんで仮に アライブ(到着する;Arrive)と呼ぶことにしようぜ?」

mapping.py:

connection_dict = {
    "<Login>.--OK--": "[LoggedIn].<LoggedIn>",
    "<Login>.--Fail--": None,
}

ramen-tabero-futsu2.png
「 👆 前の文字列をキーにして、後ろの1つが出てくるようにすればいいな」

kifuwarabe-futsu.png
「 なんで そんなものが 要るんだぜ?」

ramen-tabero-futsu2.png
「 線の つなげ直し は頻出するからだぜ」

        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
        }

ramen-tabero-futsu2.png
「 👆 ステートを文字列で与えられたら、インスタンスを返す関数を返すようにして……」

何度でもクリック!→

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位 の最近の記事