C++によるデザインパターン

up
  1. State Map Compiler が生成するパターン
  2. State Map Compiler が生成するパターンをStateパターンに変更
  3. State Map Compiler を変更(Stateパターンのコードを生成)


  1. State Map Compiler が生成するパターン
     「C MAGAZINE」1999年9月号にてεπιστημη氏より、State Map Compiler の紹介が ありました。状態遷移表をテキストに記述して、そのファイルをインプットすると、 C++のソースファイルを生成してくれる優れものです。記事にあった Object Mentorの Webページ からもソースを獲得できますが、Cマガの1999年9月、10月号にはZIP形式でCD-ROMに 収録されています。お手持ちでない方はバックナンバーを取り寄せる価値大です。  オリジナルのサンプルソースは完全ではないので、そこを補完しつつ洗練したサンプル をεπιστημη氏が掲載されております。感謝です。
     オリジナルアーカイブ(smc.shar)中のドキュメント中にサンプルソースがあります。 少し不完全なので手を加えて、テスト用プログラムも作成しました。ソースは ここ。 そののクラス図を、UMLで記述してみました。(どのクラス名もイタリックに なっていますが抽象クラスはTurnStyleStateだけです。描画・画像変換ソフトの都合上(^^;;)

     ユーザーが実際に作成するのは、上記のTurnStyleContextクラスのみです。 後は State Map Compiler が生成してくれます。
     επιστημη氏のWebページにも State Map Compiler に関するドキュメントがあります。 あります。  GoFStateパターン(Gamma本)にいくらか類似していますが、状態を変更するメソッド の可視性が public になっているので、折角作成した遷移体系を壊すコーディングを間違って 許す可能性があります。この点で、Stateパターンに劣ると私は思います。


  2. State Map Compiler が生成するパターンをStateパターンに変更
     上記のパターンをStateパターンに変形させてみるとこうなります。画像をクリックすると 詳細クラス図が表示されます。

    詳細クラス図はクリック

     詳細なクラス図を見れば分かりやすいと思いますが、 ユーザーに解放するインターフェイスが各イベントの関数と、状態を参照する関数のみ に限定され不用意なコーディングによる状態変化を抑止しています。Stateパターンは、 状態の具象クラスにSingletonパターンを利用して、各オブジェクトが唯一しか 存在しないことを守らせています。State Map Compilerが生成したコードは、TrunStyleクラスに 状態の具象クラスの各インスタンスをクラス属性として置くことで、その代替としています。 構成の都合上、そのインスタンスも可視性が public: となっているので、これまた危険でした。 汚いですがStateパターンに変形させたソースは ここです。このコード変更は人間(私)がキーパンチしました:-P
     TurnStyleクラスはTurnStyleState抽象クラスをfriend宣言しています。これをうまく 利用して且つ、TurnStyleStateクラスのメソッドを呼ぶ時には自分の参照を渡して委譲しています。


  3. State Map Compiler を変更(Stateパターンのコードを生成)
     State Map Compiler(smc)を、Stateパターンのコードを生成するように 変更を加えてみました。
     ソースはここ


[参考]
Gamma本:「オブジェクト指向における再利用のためのデザインパターン 改訂版」Erich Gamma/ Richard Helm/ Ralph Johnson/ John Vlissides
POSA:「ソフトウェア ソフトウェア開発のためのパターン体系」Frank Buscchmann/ Regine Meunier/ Hans Rohnert/ Peter Sommerlad/ Michael Stal


by masu
e-mail: massun.masumoto@nifty.ne.jp
URL : http://member.nifty.ne.jp/~masumoto/