2011年1月28日金曜日

Template Methodパターン - VDMで学ぶデザインパターン

ようやく3つ目となった、VDMで学ぶデザインパターン。今回はTemplate Methodパターン。似たような処理順番の仕様で、さらにバリエーションがあるような仕様が結構多いので、これは割と使う機会が多い。
ちなみに、今回の題材はホップステップジャンプを日本語と英語で出すこと。
まずは、Template Methodパターンで言う所のAbstractクラス。これが、アルゴリズムの流れを示す。
class AbstractHSJ
operations
  public hopStepJump : () ==> ()
  hopStepJump() == (
    hop();
    step();
    jump();
  );

  protected hop : () ==> ()
  hop() == is subclass responsibility;

  protected step : () ==> ()
  step() == is subclass responsibility;

  protected jump : () ==> ()
  jump() == is subclass responsibility;

  protected print : seq of char ==> ()
  print(s) == def - = new IO().echo(s ^ "¥n") in skip;
end AbstractHSJ
そして、Template Methodパターンで言う所のConcreteクラス。まずは日本語で出す方。
class JaHSJ is subclass of AbstractHSJ
operations
  protected hop : () ==> ()
  hop() == print("ホップ!");

  protected step : () ==> ()
  step() == print("ステップ!");

  protected jump : () ==> ()
  jump() == print("ジャンプ!");
end JaHSJ
次が英語で出す方のConcreteクラス。
class EnHSJ is subclass of AbstractHSJ
operations
  protected hop : () ==> ()
  hop() == print("Hop!");

  protected step : () ==> ()
  step() == print("Step!");

  protected jump : () ==> ()
  jump() == print("Jump!");
end EnHSJ
で、最後にこれらを使うクラス。AbstractHSJクラス型だけど、JaHSJクラスとEnHSJクラスのインスタンスとして生成して使う。
class UseHopStepJump
operations
  public use : () ==> ()
  use() == (
    dcl ja : AbstractHSJ := new JaHSJ(),
          en : AbstractHSJ := new EnHSJ();
    ja.hopStepJump();
    en.hopStepJump();
);
end UseHopStepJump
上記のクラスをVDMToolsで動作させるには、VDMToolsのインタープリタで以下のコマンドを入力してください。ちなみに、今回はVDMTools付属の標準ライブラリIOクラスを使っているので、VDMToolsのプロジェクトに、io.vppも追加しないと動作しません。
>> init
>> print new UseHopStepJump().use()

0 コメント:

コメントを投稿