(プログラミングの話題です)
以前デザインパターンを勉強していたときに、Visitorパターンというのが難解で、しかし重要だということで一生懸命理解しようとしたことがありました。
しかし、Visitorパターンはソースが追いにくくなるし、知らない人に説明するのは一苦労です。むしろ読めないソースを書く人扱いされてしまう可能性すらあります。
最近、Dependency Injectionという技術が台頭してきました。
触り程度しか知りませんが、クラス同士の依存関係を切り離してくれる技術のようです。
これを使うとVisitorパターンなど使わなくてすみそうですが、まだ標準化されていません。
(早くされないかな…)
で、私はどうしているかというと、例えば図形クラスとそれの描画クラスを考えたとき、
わざわざFIGTYPE_BOXとか図形種類を作っているのは、ifを使いたくないのと、instanceofのコストをなくすためです。
単純ですが、これなら他の人もすんなり理解できるし、メンテも楽というわけです。
でもキャストが入っているのは汚いですね…(- -;
追記: 続編を書きました。
以前デザインパターンを勉強していたときに、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のコストをなくすためです。
単純ですが、これなら他の人もすんなり理解できるし、メンテも楽というわけです。
でもキャストが入っているのは汚いですね…(- -;
追記: 続編を書きました。
