🛠️自律機械Stateパターン Strategyパターンの進化系 uxfファイル付き
状態マシンを作れるパターンがStateである
GoF本のState解説はTCPコネクションの「ステート」から始まる。「ステート」とはこちらのドキュメントの状態遷移図にある「ステート」と同じ意味、役割
抽象クラスの導入
自由に決めてもいいこと
ステート(状態)の定義は誰が行ってもいい事(Context(TCPConnection)でもState Subclass(TCPStates)でもいい)
が、State Subclassから次の遷移先(state)などを勝手に決められるほうがカッコいいので、Contextは自分の状況を抽象クラスであるStateを通じてサブクラスに伝えられると、よりカッコいい事
サブクラス同士で次の遷移を勝手に決められるなら、分散(Decentralizing)管理できるようになる。自律的(autonomous)にもなる。分散することで新しいサブクラス(ステート)をContextに依存せずに行える事。(但しサブクラス同士の依存性はあがる。)
Stateオブジェクトの生成と消滅に関してルールはない事。必要な時に全てのステートを作る方法もあれば、あらかじめすべてのステートを準備する方法もある。(手間がかかるので)生成のトレードオフがある。
ふまえて、Stateパターンの作り方手順
二つ以上の状態(ステート)を定める
初期状態を定める(ここではコンテクストにて)
状態に応じたコードをサブクラスに書く(ここでは振る舞いとして)
お好みに合わせて、次の遷移を定めるコードをサブクラスなどに書く
Stateパターンが実際に使われているHotDrawとUnidrawフレームワーク、smalltalkで作った奴はもうこの世にいないかも、しかし移植コードはここにある。。。
コンテクストとなるDrawingControllerクラスは見つけられなかったが、元はsmallTalkで書かれたHotDrawはjavaに移植されてから、js版がありgithubに公開されている。CreationToolが各Stateの一例となっている。IT'S HOT IT'S HOT
Strategyパターンのクラス構造はStateパターンとほぼ一緒。Strategyから進化したStateという見方ができる。
デザインパターンで大切なのはクラス構成じゃなくて用途(心意気)だ
クラス構成だけみたらStateもBridgeもだいぶ同じものだが、用途(コンテクスト)が違うので名前が違う。形じゃないんだ。
だから、べつにペイントで乱暴にかいて表してもいいんだ
さらにSTATEの意思だけ汲んでクラスも使わない
STATEパターンからSTATEモナドへ
お願い致します