見出し画像

🛠️自律機械Stateパターン Strategyパターンの進化系 uxfファイル付き

State pattern

状態マシンを作れるパターンがStateである


GoF本のState解説はTCPコネクションの「ステート」から始まる。「ステート」とはこちらのドキュメントの状態遷移図にある「ステート」と同じ意味、役割

TCPのステート

抽象クラスの導入

このパターンのキーとなる考え方は、ネットワーク接続の状態を表すためにTCPState(State)という抽象クラスを導入することである。

https://amzn.to/3cnFXKE
結合関係とサブクラス、抽象クラスに注目

自由に決めてもいいこと

  • ステート(状態)の定義は誰が行ってもいい事(Context(TCPConnection)でもState Subclass(TCPStates)でもいい)

  • が、State Subclassから次の遷移先(state)などを勝手に決められるほうがカッコいいので、Contextは自分の状況を抽象クラスであるStateを通じてサブクラスに伝えられると、よりカッコいい事

  • サブクラス同士で次の遷移を勝手に決められるなら、分散(Decentralizing)管理できるようになる。自律的(autonomous)にもなる。分散することで新しいサブクラス(ステート)をContextに依存せずに行える事。(但しサブクラス同士の依存性はあがる。)

  • Stateオブジェクトの生成と消滅に関してルールはない事。必要な時に全てのステートを作る方法もあれば、あらかじめすべてのステートを準備する方法もある。(手間がかかるので)生成のトレードオフがある。

ふまえて、Stateパターンの作り方手順

  1. 二つ以上の状態(ステート)を定める

  2. 初期状態を定める(ここではコンテクストにて)

  3. 状態に応じたコードをサブクラスに書く(ここでは振る舞いとして)

  4. お好みに合わせて、次の遷移を定めるコードをサブクラスなどに書く

Stateパターンが実際に使われているHotDrawとUnidrawフレームワーク、smalltalkで作った奴はもうこの世にいないかも、しかし移植コードはここにある。。。

この技術は、HotDraw と Unidraw  の両方のドローイングエディタフレームワークで使用されています(略)HotDrawでは、DrawingControllerクラスがToolオブジェクトに要求を送信します。

https://amzn.to/3cnFXKE

コンテクストとなるDrawingControllerクラスは見つけられなかったが、元はsmallTalkで書かれたHotDrawはjavaに移植されてから、js版がありgithubに公開されている。CreationToolが各Stateの一例となっている。IT'S HOT IT'S HOT

https://github.com/websemantics/hotdraw.js/tree/18fdc1e4c6427f313e69221a446023da000df03a

Strategyパターンのクラス構造はStateパターンとほぼ一緒。Strategyから進化したStateという見方ができる。

Stateパターンは、(自律した)メソッドによって戦略を切り替えることができるStrategyパターンと解釈することができます(ドヤ)

https://en.wikipedia.org/wiki/State_pattern

デザインパターンで大切なのはクラス構成じゃなくて用途(心意気)だ

クラス構成だけみたらStateもBridgeもだいぶ同じものだが、用途(コンテクスト)が違うので名前が違う。形じゃないんだ。

だから、べつにペイントで乱暴にかいて表してもいいんだ

STATEパターンで抽象化された信号機の概念、信号が遷移する所がポイント

さらにSTATEの意思だけ汲んでクラスも使わない


STATEパターンからSTATEモナドへ

状態モナドを用いると、プログラマは任意の型の状態情報を計算に付加することができる。任意の値型が与えられたとき、状態モナドの対応する型は、状態を受け入れ、新しい状態(s型)を戻り値(t型)とともに出力する関数である。これは環境モナドに似ているが、新しい状態を返すので、変更可能な環境をモデ ル化できる。


お願い致します