再利用性
あたりまえっぽいけど、あるクラスを再利用 してもらえる かどうかは、誰が再利用するのかに依存する。
たとえば、以下のような Point クラスと:
以下のような、Observer が適用された Point クラスのどっちが再利用しやすいだろうか?
public class Point {private int x;
private int y;public void setX(int x) {
this.x = x;
}public int getX() {
return x;
}
// y についても同様
}
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();
}
}
}
なんでこの話を書いたかっていうと、今までは、どちからというと、シンプルなインタフェースを持つクラスの方が再利用性が向上すると、思っていた(感じていたため)。実際、そうかもしれないし、そうじゃないかもしれない。再利用性が向上する、と、誰かにアピールする必要性が出てきて、はじめて、こっちの立場(ライブラリとかを開発する側)だけでそうだと決め付けられるものじゃないな、と思った。