octech このページをアンテナに追加 RSSフィード

2008-12-16 実装も大事

[][]あるStateパターンの実装について 14:10 あるStateパターンの実装についてを含むブックマーク

Graphics.moveTo(), Graphics.lineTo()の切り替えを、if分を使わずにStateパターンを使って実装するという話。

この二つの切り替えは確かに面倒なので、ここでStateパターンの使いどころとしてなるほど便利だなー、と思った。

しかし、この実装の仕方はちょっとおかしい。

IStateクラスというインターフェイスクラスを作り、それをMoveToStateクラスでimplements、そのMoveToStateクラスを派生させてLineToStateクラスでしているのだ。

なぜ派生させているのかというと、LineDrawerという管理クラスへの参照を持つために、純粋にメソッドだけ定義することができないからだ。その結果、MoveToState, LineToStateが同等でないクラス構成になり、とても気持ち悪く感じる。私は、Stateパターンでは、それぞれのStateがなるべく同等であるべきだと思うのです(もちろん例外はある)。

私が実装するなら

で、この実装の場合には基底クラスを作るべきだ、と思うのです。

つまり、以下のような基底クラスLineDrawBaseを作り、これをMoveToStateクラス、LineToStateクラスへと派生させればいいのだ。

public class LineDrawBase{
  protected var _drawer:LineDrawer;
  public function LineDrawBase( drawer:LineDrawer ){
    _drawer = drawer;
  }
  public function draw( x:Number, y:Number ) :void{
    // 派生クラスでoverrideする.
  }
}

borealkissborealkiss 2008/12/16 22:38 なるほど、気持ち悪いというニュアンスはたしかにおっしゃるとおりだと思います。参考になりました。

octechoctech 2008/12/17 17:03 borealkissさん、
いえいえ、こちらこそ、Stateパターンの使い方が勉強になりました!ありがとうございます。