Java.use(better);

《前の記事|記事一覧次の記事
Java.use(better);


Episode#07

NullObject パターンの事例 -- if と別れる50の方法


《関連記事》

《目的》
NullObject パターンを適用した事例を通して、その理解を深めます。また、分業プログラミングを支援する「ハリウッドの原則」についても紹介します。
《動機》
アプリケーションとして「15パズル」を作成するときに苦労するのは、16番目のコマの取扱いです。構造化プログラミング〔= SP〕の通例に従うと、二次元配列を利用するときに、16番目のタイル、つまり空白部分を埋めるのに null を利用するという定石を踏みます。

ところが、Java/Scala では、null は半人前のオブジェクトとして扱われ、オブジェクト指向プログラミング〔= OOP〕の枠組みで統一して扱えないので、その対処に苦慮します。Jython/Smalltalk では、null も一人前のオブジェクト〔= first-class object〕として扱えるので、すべてを OOP の枠組みで統一できます。
そこで、NullObject パターンを適用して、空白部分を表わす null を first-class object に代えると、すべてのタイルを統一的に扱えます。

■ 16番目のタイル: NullObject パターンの応用

まず、番号が付いた15枚のタイルを用意します。

abstract class Piece implements Shape {
  Color backgroundColor() { return Color.white; }
  abstract protected void drawValue(Graphics g, int x, int y);
}

 ̄規定メソッド backgroundColor では、タイルの色を Color.white とします。抽象メソッド drawValue は、タイルに番号を付けます。

class Tile extends Piece {
  protected void drawValue(Graphics g, int x, int y) {
    g.drawString(value+"", x+6, y+16);
  }

クラス Tile おいて、具象メソッド drawValue では、タイルに番号を表示します。

しかし、空白部分には、番号を表示しません。そこで、NullObject パターンを適用して、null ではなく、first-class object に代えると、すべてのタイルを統一的に扱えます。

class Tile ...
  static Tile nullObject;

空白部分に相当する nullObject は、唯一無二の存在〔= singleton〕です。そのため、Singleton パターンとの併用になります。そこで、

  static {
    nullObject = new Tile(d0, d0, 0) {
      Color backgroundColor() { return Color.lightGray; }
      protected void drawValue(Graphics g, int x, int y) {}
    };
  }

規定メソッド backgroundColor を再定義して、タイルの色を灰色 Color.lightGray とします。具象メソッド drawValue では、タイルに番号を表示しません。クラスに固有の情報は「static ブロック」内に限定しておくと、リソースの管理が楽になるので、プログラミングの能率が上がります。

 ↑ TOP

》作業中です《

update*13/02/23 19:16:21

♪ 雛遊び(ひなあそび)



出典 ☞ http://shimayu.co.jp/modules/myalbum/photo.php?lid=99