CodeZine(コードジン)

特集ページ一覧

Eclipse RCPプログラミング 1:RCPを生かすアーキテクチャ

ViewCVSをすばやくブラウズする拡張ブラウザの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
目次

RCP開発のポリシー

 いざRCPで開発だといっても、何をどうすればよいかが分からないかもしれません。そのため、次の事項をなるべく守るように設計していくと良いと思います。

  • 複雑なビューは作るな、複雑なパースペクティブにせよ
  • ひとつのビューやエディタを複雑にしてしまうと、ただのSWTアプリケーションを作るのと大差がなくなってしまいます。RCPはパースペクティブという概念を持っているので、圧倒的に簡単にレイアウトや制約を設定することできます。
  • ボタンよりもアクションを使え
  • ボタンは活性、非活性の切り替えが受動的になり、個々のウィジェット同士の結びつきが密になってしまいます。アクションは能動的な切り替えを可能とし、ツールバーにも、ポップアップメニューにも同じアクションを利用することができます。また、ショートカットキーも設定することができます。
  • ビュー、エディタは直接参照を行ってはいけない
  • 双方向に参照を持たせると変更に弱くなってしまいます。参照を一方向にすることで、参照元を自由に変更することが可能になります。もっと言えば、直接的な参照を行わないことにより、ビューなどのGUI部分とロジック部分の切り離しを容易に行えます。

アーキテクチャ

 RCPアプリケーションが採用すべきアーキテクチャは次のようになります。

基本アーキテクチャ
基本アーキテクチャ
  • マウスクリックやキー操作によってアクションが実行される
  • アクションはオブジェクト群に対して何らかの変更を行う
  • オブジェクト群はすべてのビューに対して変更の通知を行う
  • それぞれのビューは変更内容に興味がある場合に表示を更新する

ViewCVS専用ブラウザの作成

 実際にViewCVS専用ブラウザの作成を通して、ポリシーの実現方法について説明します。

"モデル"を考える

 まずは、今回作るViewCVSの機能を実現するためのモデルを考えます。

画面イメージをざっくりと考える

 何はともあれ、画面イメージを最初に考える必要はあります。しかし、ここは本当にざっくりで充分です。なぜなら、RCPにおいて画面のレイアウトや、新しいビューの追加は容易に実施できるからです。

 とりあえず、直感的に思いつく画面イメージはこんなところです。

画面イメージ
画面イメージ

ドメインモデルを考える

 次にViewCVSが持っている情報をクラス化してみましょう。ここではGUIを考慮する必要は無く、通常のクラス分析から割り出します。割り出したクラス構成は次のようになります。

モデルクラス構成
モデルクラス構成

イベント通知機能を追加する

 JDKのAPIとして、JavaBeansにイベント通知を付加するjava.beans.PropertyChangeEventjava.beans.PropertyChangeListenerがあります。今回はこれらを利用して、クラスにイベント通知機能を追加していきましょう。

イベント通知機能の追加
public class CVSModule extends CVSFolder {

    public static final String EVENT_UPDATE_URL = "url";
    
    @Override
    public void setUrl(String url) {
        super.setUrl(url);
        firePropertyChange(this, EVENT_UPDATE_URL, url);
    }
    
    /**
     * PropertyChangeListener.
     */
    private List<PropertyChangeListener> listeners
        = new ArrayList<PropertyChangeListener>();
    
    /**
     * リスナーの追加.
     * @param listener リスナー.
     */
    public void addPropertyChangeListener(
        PropertyChangeListener listener) {
        listeners.add(listener);
    }
    
    /**
     * リスナーの除去.
     * @param listener リスナー.
     */
    public void removePropertyChangeListener(
        PropertyChangeListener listener) {
        listeners.remove(listener);
    }
    
    /**
     * プロパティ変更イベントの発行.
     * @param name
     * @param value
     */
    protected void firePropertyChange(
        Object source, String name, Object value) {
        for (PropertyChangeListener listener : listeners) {
            listener.propertyChange(new PropertyChangeEvent(
                source, name, null, value));
        }
    }
}

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Eclipse RCPプログラミング

著者プロフィール

  • NTTデータ先端技術株式会社 志田 隆弘(シダ タカヒロ)

    &lt;NTTデータ先端技術株式会社について&gt; データベース、ネットワーク、OS、ミドルウェアの基盤技術を武器にシステムの技術面でのコンサルテーションや最新製品の調査を行う専門家集団。 &lt;筆者について&gt; Ja-Jakartaプロジェクトの末席にこっそりと参加しています。...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5