Java.use(better);
《目的》
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
》作業中です《♪ 雛遊び(ひなあそび)