再利用性

あたりまえっぽいけど、あるクラスを再利用 してもらえる かどうかは、誰が再利用するのかに依存する。


たとえば、以下のような Point クラスと:


public class Point {

private int x;
private int y;

public void setX(int x) {
this.x = x;
}

public int getX() {
return x;
}
// y についても同様
}

以下のような、Observer が適用された Point クラスのどっちが再利用しやすいだろうか?

public class Point {

private int x;
private int y;

private List observers = new ArrayList();

public void addObserver(PointObserver o) {
this.observers.add(o);
}

public void setX(int x) {
this.x = x;

for(Iterator itr = observers.iterator(); itr.hasNext();) {
( (PointObserver)itr.next() ).updated();
}
}

public int getX() {
return x;
}
// y についても同様
}

最初に言ったように、誰が再利用するかに依存する。


ある人は、シンプルな Point クラスを選ぶだろうし、ある人は、Observer のケースを必要事項だとして選ぶ。


何が言いたいのか、っていうと、再利用しやすいかどうかは、開発側からだけの意見で簡単にはいえないぞ、ってこと。


だからこそ、シンプルなインタフェースと多機能なインタフェースのバランスをうまくとるのが難しいところだっりする(と思う)。


ここまでは、普通の話。ここからも、まあ、普通の話。AspectJ の inter-type 宣言は、もう一つの選択肢を加える。つまり、付加的な機能は、アスペクトとして拡張可能な形で定義しておく:


public aspect PointExtension {

private List Point.observers = new ArrayList();

public void Point.addObserver(PointObserver o) {
this.observers.add(o);
}

after(Point p) : target(p) && call(void Point.setX(int)) {
for(Iterator itr = p.observers.iterator(); itr.hasNext();) {
( (PointObserver)itr.next() ).updated();
}
}
}


なんでこの話を書いたかっていうと、今までは、どちからというと、シンプルなインタフェースを持つクラスの方が再利用性が向上すると、思っていた(感じていたため)。実際、そうかもしれないし、そうじゃないかもしれない。再利用性が向上する、と、誰かにアピールする必要性が出てきて、はじめて、こっちの立場(ライブラリとかを開発する側)だけでそうだと決め付けられるものじゃないな、と思った。