![見出し画像](https://assets.st-note.com/production/uploads/images/83196941/rectangle_large_type_2_277293162f2a4f8ebacd7f328fee741a.png?width=1200)
🛠️自律機械Stateパターン Strategyパターンの進化系 uxfファイル付き
![](https://assets.st-note.com/img/1658139556937-aPQLbcNyjV.png?width=1200)
状態マシンを作れるパターンがStateである
GoF本のState解説はTCPコネクションの「ステート」から始まる。「ステート」とはこちらのドキュメントの状態遷移図にある「ステート」と同じ意味、役割
![](https://assets.st-note.com/img/1658144150098-R0HB5mo3hu.png?width=1200)
抽象クラスの導入
このパターンのキーとなる考え方は、ネットワーク接続の状態を表すためにTCPState(State)という抽象クラスを導入することである。
![](https://assets.st-note.com/img/1658166687348-6Za9QaEHxe.png?width=1200)
自由に決めてもいいこと
ステート(状態)の定義は誰が行ってもいい事(Context(TCPConnection)でもState Subclass(TCPStates)でもいい)
が、State Subclassから次の遷移先(state)などを勝手に決められるほうがカッコいいので、Contextは自分の状況を抽象クラスであるStateを通じてサブクラスに伝えられると、よりカッコいい事
サブクラス同士で次の遷移を勝手に決められるなら、分散(Decentralizing)管理できるようになる。自律的(autonomous)にもなる。分散することで新しいサブクラス(ステート)をContextに依存せずに行える事。(但しサブクラス同士の依存性はあがる。)
Stateオブジェクトの生成と消滅に関してルールはない事。必要な時に全てのステートを作る方法もあれば、あらかじめすべてのステートを準備する方法もある。(手間がかかるので)生成のトレードオフがある。
ふまえて、Stateパターンの作り方手順
二つ以上の状態(ステート)を定める
初期状態を定める(ここではコンテクストにて)
状態に応じたコードをサブクラスに書く(ここでは振る舞いとして)
お好みに合わせて、次の遷移を定めるコードをサブクラスなどに書く
Stateパターンが実際に使われているHotDrawとUnidrawフレームワーク、smalltalkで作った奴はもうこの世にいないかも、しかし移植コードはここにある。。。
この技術は、HotDraw と Unidraw の両方のドローイングエディタフレームワークで使用されています(略)HotDrawでは、DrawingControllerクラスがToolオブジェクトに要求を送信します。
コンテクストとなるDrawingControllerクラスは見つけられなかったが、元はsmallTalkで書かれたHotDrawはjavaに移植されてから、js版がありgithubに公開されている。CreationToolが各Stateの一例となっている。IT'S HOT IT'S HOT
![](https://assets.st-note.com/img/1658141017573-fQgx4uHJE5.png?width=1200)
Strategyパターンのクラス構造はStateパターンとほぼ一緒。Strategyから進化したStateという見方ができる。
Stateパターンは、(自律した)メソッドによって戦略を切り替えることができるStrategyパターンと解釈することができます(ドヤ)
デザインパターンで大切なのはクラス構成じゃなくて用途(心意気)だ
クラス構成だけみたらStateもBridgeもだいぶ同じものだが、用途(コンテクスト)が違うので名前が違う。形じゃないんだ。
だから、べつにペイントで乱暴にかいて表してもいいんだ
![](https://assets.st-note.com/img/1658538859250-9UOUDkbOTg.png?width=1200)
さらにSTATEの意思だけ汲んでクラスも使わない
STATEパターンからSTATEモナドへ
状態モナドを用いると、プログラマは任意の型の状態情報を計算に付加することができる。任意の値型が与えられたとき、状態モナドの対応する型は、状態を受け入れ、新しい状態(s型)を戻り値(t型)とともに出力する関数である。これは環境モナドに似ているが、新しい状態を返すので、変更可能な環境をモデ ル化できる。
お願い致します