このアイデアを理解するために、解決しようとしている問題の立場から見てみましょう。よく見かけるのは、UIに組み込まれたデータアクセスのためのコード、例えばデータベースを呼び出す画面にコードがあるかと思います。その代わりに、機能指向のJava開発(feature-oriented Java development)ではドメインの集合、この場合は以下に示すようなTrips(旅行計画のアプリケーションを例にしています)の集合を提供するオブジェクトを作成します。
このオブジェクトはフィーチャーを割り当てることによって作成します。下のコードで、SaveableEntityCapabilityやRemovableEntityCapabilityといったフィーチャー(機能)を確認できると思います。両者およびその他のフィーチャーともインターフェースです。このインターフェースは、以下のコレクションオブジェクト内でLoopupを返す実装になっています。これはLoopup.Providerを実装しているためです。
public final class TripCollection implements Lookup.Provider {
private List trips;
private Lookup lookup;
private InstanceContent instanceContent;
private TripSearchDAO dao = new TripSearchDAO();
public TripCollection() {
trips = new ArrayList();
// Create an InstanceContent to hold abilities...
instanceContent = new InstanceContent();
// Create an AbstractLookup to expose InstanceContent contents...
lookup = new AbstractLookup(instanceContent);
// Add a "Reloadable" feature to this entity:
instanceContent.add(new ReloadableEntityCapability() {
@Override
public void reload() throws Exception {
ProgressHandle handle = ProgressHandleFactory.createHandle("Loading...");
handle.start();
List result = dao.search();
for (Trip trip : result) {
if (!getTrips().contains(trip)) {
getTrips().add(trip);
}
}
handle.finish();
}
});
// Add a "Saveable" feature to this entity:
instanceContent.add(new SaveableEntityCapability() {
@Override
public void save(Trip trip) throws Exception {
dao.save(trip);
}
});
// Add a "Creatable" feature to this entity:
instanceContent.add(new CreatableEntityCapability() {
@Override
public void create(Trip trip) throws Exception {
dao.create(trip);
}
});
// Add a "Removable" feature to this entity:
instanceContent.add(new RemovableEntityCapability() {
@Override
public void remove(Trip trip) throws Exception {
dao.remove(trip);
getTrips().remove(trip);
}
});
}
@Override
public Lookup getLookup() {
return lookup;
}
public List getTrips() {
return trips;
}
}
アプリケーションの任意の場所で、コレクションオブジェクトの参照を取得することができ、"getLoopup"を使って機能を照会し、必要なフィーチャーのメソッドを呼び出すことができます。このように、UI開発者はフィーチャーの名前だけ知っておけばよく、その他の実装を気にする必要はないのです。
CRUDシナリオに注目した資料がNetBeans ZoneにUpされています。
JFugue Music NotePadをこのアプローチで再設計しようかと考えています。フィーチャーで構成するLoopupを返すCompositionオブジェクトがあればいいのですが、ではどんなフィーチャーでしょう。”CreatableMusicCapability”、”ConvertableFileCapability”、”ManipulatablePatternCapability”といった名前と共にフィーチャーは存在すると、JFugue Featuresのページで仄めかしています。そしてこれらのフィーチャー全ての実装は一つのJavaクラスに集約されます。アプリケーション全体に機能が散らばっている実装に比べて、本当に整理され使い勝手がよいのです。
原文はこちら。
http://blogs.oracle.com/geertjan/entry/feature_oriented_java_development
0 件のコメント:
コメントを投稿