このドキュメントはMVCフレームワーク「Reffi (RIA Extention Framework Fundamental Implementation)」(Flex版)のAPI仕様書です。

コンセプト

このフレームワークは以下のコンセプトとモチベーションで開発されています。

  1. 明瞭なクライアント側MVCアーキテクチャ

    構成をView(mxml + Action)、Controller、Modelに分けることで、 出来上がる成果物が自然に機能レイヤ分け、パッケージ分けされます。

  2. ユーザインターフェース開発とコード開発の分離

    mxmlの開発、業務ロジックの開発を分離することで、デザイナとプログラマの分業が図れるようになります。

  3. 開発ガイドラインとなる雛形処理フローの提供

    業務ロジックが決められたシステムロジックに沿って処理されることで、 処理フロー設計を省略出来ることを目指しています。
    又、決められたメソッドのオーバーライドによる業務ロジックの実装は、 メソッド名の命名等、地味ながらレビュー時コストが掛かる作業を省きます。

全体概要

ReffiにおいてMVCを構成する要素はBaseAction、BaseController、BaseModelの3クラスから成ります。
各クラスが受け持つ役割と、継承先の業務クラスとの関係は以下のようになります。

BaseAction
  • 擬似イベントハンドラの提供
    prepare
  • 実行モデル群予約メソッドの提供
    reserveModels
  • Validationオブジェクト設定メソッドの提供
    validators
  • 実行前のモデルを操作する為のフックメソッド提供
    nextModel
  • モデル処理結果ハンドラの提供
    successForward
  • モデル処理失敗ハンドラの提供
    failureForward
←制御
BaseController
  • 初期化処理メソッドの提供
    initialize
  • イベント紐付けメソッドの提供
    bind
  • 全イベントハンドリングのファサード
    handlerFacade
  • アクションの実行
    executeAction
  • 登録モデル群の実行
    runModels~
  • モデルの結果をアクションへ通知
    modelSuccess、modelFailure
→実行
BaseModel
  • 処理フローの提供
    preproc、mainproc、postproc
  • モデル正常終了通知メソッドの提供
    fireModelSuccess
  • モデル異常終了通知メソッドの提供
    fireModelFailure
↑継承 ↑継承 ↑継承
具象Action(一イベント毎に一個)
  • 業務処理内容に応じてBaseActionのメソッドを実装
具象Controller(mx:Applicationに一個)
  • 初期化処理の実装
  • イベント紐付け情報の定義
具象Model(任意でn個)
  • mainprocを実装して機能実装

具象Modelに関しては、HTTP通信、Pub/Subの機能を実装した機能モデルをReffiパッケージで提供しています。
単純に上記を行うだけであれば、具象モデルを作成する必要は有りません。

システムロジックフロー全体概要図

開発の流れ

Reffiを使ってFlexアプリケーションを構築する場合、以下の手順を踏みます。
題材はアプリケーション起動後、「Hello World Window」という名前のパネルが表示され、 パネル内の「Hello World」ボタンが押下されると、同パネル内のラベルにHello Worldが表示されるものです。

  1. mx:Applicationタグを持つ初期ページ(index.mxml等)に具象コントローラを登録

    BaseControllerを継承した具象コントローラタグをApplicationの子ノードとして登録します。
    (このケースではdemo.client.controllerパッケージのDemoControllerクラスとしています。)
    具象コントローラはmx:Applicationに付き一個作成します。

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:controller="demo.client.controller.*" layout="absolute">
        <controller:DemoController/>
        
        <mx:Panel name="panel" x="10" y="33" width="311" height="239" layout="absolute">
            <mx:Button name="panel.btnHelloWorld" x="10" y="10" label="HelloWorld"/>
            <mx:Label name="panel.lblHelloWorld" x="10" y="40" text="" width="189" height="32"/>
        </mx:Panel>
        
    </mx:Application>
    			
    この例ではControllerの他、panelという名前のウィンドウ、panel.hwHelloWorldという名前のボタン、 panel.lblHellowWorldという名前のラベルを配置しています。
    (name属性値を「パネル名.コンポーネント名」としているのは、エレメント名のユニーク性を確保する為です。規約では有りません。)

  2. 具象コントローラを作成

    1で登録記述した具象コントローラを作成します。
    BaseControllerを継承したクラスとして作成して下さい。

    package demo.client.controller {
        
        import jp.co.fujitsu.reffi.client.flex.controller.BaseController;
        import jp.co.fujitsu.reffi.client.flex.controller.EventBinder;
    
        public class DemoController extends BaseController {
        }
    }            

    1で登録したことにより、DemoControllerインスタンスはApplicationの子ノードインスタンスとしてメモリに常駐するようになります。

  3. 具象コントローラにイベント、アクションの紐付けを追加

    bindメソッドをオーバーライドして、引数EventBinderに対してイベント登録を行います。
    下記例は、1で配置したpanel.btnHelloWorldボタンが押下されると、HelloWorldActionが起動される紐付けを定義しています。

    package demo.client.controller {
        import flash.events.MouseEvent;
        
        import jp.co.fujitsu.reffi.client.flex.controller.BaseController;
        import jp.co.fujitsu.reffi.client.flex.controller.EventBinder;
        
        import test.reffi.action.HelloWorldAction;
    
        public class DemoController extends BaseController {
            
            override protected function bind(eventBinder:EventBinder):void {
                eventBinder.addEventBinding("panel.btnHelloWorld", MouseEvent.CLICK, Class(HelloWorldAction));
            }
                    
        }
    }
    			
    これでエレメント、イベントタイプ、起動アクションの紐付け登録が行われました。

  4. 具象アクションを作成

    最後に、イベント発生時実際に起動するアクションクラスを作成します。 アクションクラスはBaseActionを継承して作成します。

    package test.reffi.action {
        import jp.co.fujitsu.reffi.client.flex.action.BaseAction;
        import jp.co.fujitsu.reffi.client.flex.controller.ParameterMapping;
        
        import mx.controls.Label;
    
        public class HelloWorldAction extends BaseAction {
    
            override protected function prepare(parameterMapping:ParameterMapping):Boolean {
                var lblHelloWorld:Label = getComponentByName("panel.lblHelloWorld") as Label;
                lblHelloWorld.text = "Hello World!";
                
                return true;
            }        
        }
    }
                
    prepareメソッドはモデル実行前の前処理や、エレメント操作等のクライアント内で完結する処理等、 汎用的なイベントハンドリングメソッドとして使用出来ます。

    以上で一イベントの処理実装は終了です。イベントが増える毎に3~4を繰り返します。
    このケースではモデルは使用していません。HTTP通信等の機能モデルを使用した業務処理を実装する場合は、 別途当リファレンス内のサンプルを参照して下さい。


 PackageDescription
 jp.co.fujitsu.reffi.client.flex.action 
 jp.co.fujitsu.reffi.client.flex.controller 
 jp.co.fujitsu.reffi.client.flex.error 
 jp.co.fujitsu.reffi.client.flex.events 
 jp.co.fujitsu.reffi.client.flex.manager 
 jp.co.fujitsu.reffi.client.flex.model 
 jp.co.fujitsu.reffi.client.flex.model.localConnection 
 jp.co.fujitsu.reffi.client.flex.model.messaging 
 jp.co.fujitsu.reffi.client.flex.model.rpc 
 jp.co.fujitsu.reffi.client.flex.model.timer 
 jp.co.fujitsu.reffi.client.flex.util 
 jp.co.fujitsu.reffi.client.flex.validator