[Java] Feature-Oriented Java Development

この数週間のうちに学んだクールで新しい(?)Javaの開発方法をご紹介しましょう。このアプローチは、Lookupコンセプトを通じて、NetBeans Platformアプリケーションのコンテキストの「機能」と呼ばれています。
このアイデアを理解するために、解決しようとしている問題の立場から見てみましょう。よく見かけるのは、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 件のコメント:

コメントを投稿