asatoの技術的な日常日記

「成長に最大の責任をもつ者は、本人であって組織ではない。自らと組織を成長させるためには何に集中すべきかを、自らに問わなければならない」  非営利組織の経営 - ピーター・ドラッカー

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アスペクト指向デザイン

あるオブジェクトは、デフォルトの状態を持つとします。でも、できるなら、状態の初期値は、アプリケーションに依存せずに設定したい。アスペクトは、役立つかな?

実際の例:


public class Enemy extends AbstractMapCharacter implements FrameListener {

....

private EnemyProperty property = new EnemyProperty();

public Enemy() { }

...
}

public class EnemyProperty {

private List<Class<? extends MapObject>> movableMapObjects = new ArrayList<Class<? extends MapObject>>();
private List<Class<? extends MapObject>> unmovableMapObjects = new ArrayList<Class<? extends MapObject>>();

public EnemyProperty() {

movableMapObjects.add(Floor.class);

unmovableMapObjects.add(Player.class);
unmovableMapObjects.add(Enemy.class);
}
...
}


この EnemyProperty クラスのコンストラクタでは、Enemy オブジェクトが移動できる対象を決めている。でも、できるなら、こういうコードは外で設定したい。でも、外で設定するとなると、オブジェクトを作るたびに初期化コードを呼ばないといけない。

典型的な解決策は、たぶん、Factory クラスを作って、デフォルトの設定をされたオブジェクトを作って返すことだと思う。


public class EnemyPropertyFactory {

public EnemyProperty createDefaultProperty() {

EnemyProperty property = new EnemyProperty();

property.addMovableMapObject(Floor.class);

property.addUnmovableMapObject(Player.class);
property.addUnmovableMapObject(Enemy.class);

return property;
}
}

public class Enemy extends AbstractMapCharacter implements FrameListener {

....

private EnemyProperty property = EnemyPropertyFactory.createDefaultProperty();

public Enemy() { }

...
}


以下は、アスペクト的解決策:


public class EnemyProperty {

...

public EnemyProperty() { }

...
}

public aspect EnemyPropertyDefaultInitialization {

after(EnemyProperty property) : this(property) && execution( EnemyProperty.new(..)) {

property.addMovableMapObject(Floor.class);

property.addUnmovableMapObject(Player.class);
property.addUnmovableMapObject(Enemy.class);
}
}



このアスペクトでは after アドバイスでコンストラクタをインターセプトして、初期状態を設定している。

以下は、上記の3つのアプローチの DSM。
enemy_before_dsm

enemy_before2_dsm

enemy_after_dsm


スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://asatohan.blog77.fc2.com/tb.php/10-55a17b1c
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。