parent するぐらいなら Singleton にしろ


前回のTERACOでmakocheから飛び出た格言

「parent するぐらいなら Singleton にしろ!」

Flashでの話で登場した格言ですが、

ここではCairngormのViewHelperにおいて、同様にparentDocumentを使用しない方法を書いてみます。



CairngormのViewHelper

CairngormのViewHelperでは、ViewStackの切替えなどで、親コンポーネントの要素へアクセスする必要が出た際、

「view.parentDocument.id名」と記述する必要があります。

もうひとつ親のmxmlまで遡るなら「view.parentDocument.parentDocument.id名」。

これでは、

mxmlの親子関係を簡単に変更する事ができず、メンテナンス性が落ち、makocheの名言から学習していない事になります。

■対策案

そこで、ViewHelperのprotectedプロパティであるview:Objectを、他のViewHelperからアクセス可能にするために、
以下のようなサブクラスを作成します。

import com.adobe.cairngorm.view.ViewHelper;

public class ViewHelperEx extends ViewHelper
{
  public function get viewObj():Object{
    return super.view;
  }
}

はい。
一応、getterしか作りません。(Read Only)

で、このクラスを継承して各ViewHelperクラスを作成するルールにします。

public class FooViewHelper extends ViewHelperEx
・・・

ViewLocatorには全てのViewHelperインスタンスがDictionaryに格納されていますので、
ViewLocatorを使用して、他のViewHelper.viewにアクセスすることが出来るようになります。

・・・(ViewHelperクラスにて)・・・

    // アクセスしたいmxmlのHelperインスタンスを取得する
    var barHelper : BarViewHelper = 
        ViewLocator.getInstance().getViewHelper("取得したいViewHelperインスタンス名") as BarViewHelper;

    // 例えばviewStackを切り替える
    barHelper.viewObj.vStack.selectedChild = 
            barHelper.viewObj.xxxxx;
・・・

■ViewLocatorを使う

これで、作成したコンポーネントのDOMツリーを意識しなくてよくなり、
画面周りとスクリプトをすこし疎な結合にする事が出来ました。

ViewLocatorは、ViewHelperのインスタンスを全て持っています。
また、mxml同士の相対的な位置関係を意識する事無くアクセスできますので、
どんどん有効活用すればいいと思います。