Visitorパターンの代わりに

| コメント(2) | トラックバック(0)
(プログラミングの話題です)

以前デザインパターンを勉強していたときに、Visitorパターンというのが難解で、しかし重要だということで一生懸命理解しようとしたことがありました。
しかし、Visitorパターンはソースが追いにくくなるし、知らない人に説明するのは一苦労です。むしろ読めないソースを書く人扱いされてしまう可能性すらあります。

最近、Dependency Injectionという技術が台頭してきました。
触り程度しか知りませんが、クラス同士の依存関係を切り離してくれる技術のようです。
これを使うとVisitorパターンなど使わなくてすみそうですが、まだ標準化されていません。
(早くされないかな…)

で、私はどうしているかというと、例えば図形クラスとそれの描画クラスを考えたとき、

// 図形
class Figure
{
  public static final int FIGTYPE_BOX = 0;
  public static final int FIGTYPE_LINE = 1;

  public abstract int getFigureType();
}

class Box extends Figure
{
  private int left, bottom, right, top;

  public int getFigureType() {
    return FIGTYPE_BOX;
  }

  // 以下、getter/setterなど
}

class Line extends Figure
{
  private int x1, y1, x2, y2;

  public int getFigureType() {
    return FIGTYPE_LINE;
  }

  // 以下、getter/setterなど
}


// 描画
class Drawer
{
  public void drawLine(Line line) {
    // 描画処理
  }

  public void drawBox(Box box) {
    // 描画処理
  }
}
というようにして、描画をさせる所では
  Public draw() {
    // figListにFigure全てが入っている
    for (Figure fig : figList) {
      switch (fig.getFigureType()) {
      case Figure.FIGTYPE_BOX:
        drawer.drawBox((Box)fig);
        break;
      case Figure.FIGTYPE_LINE:
        drawer.drawLine((Line)fig);
        break;
      default:
        assert false;
      }
    }
  }
こんな風にします。
わざわざFIGTYPE_BOXとか図形種類を作っているのは、ifを使いたくないのと、instanceofのコストをなくすためです。

単純ですが、これなら他の人もすんなり理解できるし、メンテも楽というわけです。
でもキャストが入っているのは汚いですね…(- -;


追記: 続編を書きました。

トラックバック(0)

トラックバックURL: http://soin.jp/mt/mt-tb.cgi/1742

    follow me on Twitter

    ウェブページ

    このブログ記事について

    このページは、ORIが2006年4月 8日 21:29に書いたブログ記事です。

    ひとつ前のブログ記事は「イヤホン安定器を発明しました!!」です。

    次のブログ記事は「Visitorパターンの代わりに その2」です。

    最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

    Powered by Movable Type 4.23-ja