Flex開発では、UI設計に気をつけて!

拝啓、Flexを始めて採用しようとしているWebアプリケーション開発者の方々へ。


ActionScriptが、他の言語と違う点として、後付で、UI系の言語実装を追加したのではなく、UI系ありきで、設計された言語といわれています。
そして、これを実感したのは、Flexを始めて採用したプロジェクトをやったときの話・・

画面設計時に、ButtonやCanvasなんかの配置としての画面構成は、概ね決まっていました。
ですが、コンポーネントの階層までは、意識しておらず、つまりは、平面1枚の画面構成だけが、決まっている形でした。

そして、イベントを拾うコンポーネントは、どの階層のコンポーネントで、やるかは深く考えずに、対象コンポーネントに登録して、実装していった結果。。。

といった具合に、メンテナンス性が抜群に悪いモノが出来てしまったのでした。
(加えていうなら、View部分以外にも、問題はあったんだけど、それはまた別のお話)


では、次に、以下のサンプルコードを試してみてください。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
        xmlns:mx="http://www.adobe.com/2006/mxml"
        creationComplete="init()" 
        layout="absolute">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            
            private function init():void {
                exeButton.addEventListener(MouseEvent.CLICK, buttonClick);
                msgLabel.addEventListener(MouseEvent.CLICK, labelClick);
                mainCanvas.addEventListener(MouseEvent.CLICK, canvasClick);
                mainPanel.addEventListener(MouseEvent.CLICK, panelClick);
            }
            
            private function buttonClick(event:MouseEvent):void {
                Alert.show("button");
            }
            
            private function labelClick(event:MouseEvent):void {
                Alert.show("label");
            }
            
            private function canvasClick(event:MouseEvent):void {
                Alert.show("canvas");
            }
            
            private function panelClick(event:MouseEvent):void {
                Alert.show("panel");
            }
            
        ]]>
    </mx:Script>
    
    <mx:Panel id="mainPanel" title="『ここはパネル』" width="100%" height="100%" layout="absolute">
        <mx:Canvas id="mainCanvas" width="80%" height="80%">
        
            <mx:VBox height="20%" borderColor="blue" borderThickness="2">
                <mx:Label text="階層構造は以下の通り" />
                <mx:Label text="<panel ⇒ canvas ⇒ label ⇒ button>" />
                
                <mx:Spacer height="100%" />
                
                <mx:Label id="msgLabel" text="『ここはラベル』" />
                <mx:Button id="exeButton" label="ボタン"/>
            </mx:VBox>
            
        </mx:Canvas>
    </mx:Panel>

</mx:Application>

Flexというか、ActionScript3では、イベントを発生させると、最上層のコンポーネントであるstageから順に最下層にあるコンポーネントまで、全てイベントを通知し、最下層に到達したら、さらに逆の順を辿って、最上層のstageまで通知が返っていく仕組みになっています。(上記のサンプルコードは、それが少し体感できるものじゃないかと思います)

では、想像してみてください。仕様上、このサンプルコードで書かれたコンポーネントの全てに、マウスのクリックイベントが必要だった時のことを。。

あなたなら、どうやって、それぞれのコンポーネントでクリックイベントを拾って実装しますか?w


と、何か、変な話になってしまいましたが、私の経験からは、少なくとも以下の点を考慮した設計をやった方がよい気がします。

この辺、Webディレクターの方々には、当然のことなんでしょうけど、Webアプリケーション開発者の視点から伝えたかったのは、Flex(RIA)開発の際には『UI設計は、しっかりやろう』ということです。