Flex/AIRアプリでのルートエージェント

PACのコンポーネント指向の見方ではControlが中心的な役割を果たす。ルート(のエージェント)でも同じだ。しかしFlex/AIRアプリはApplicationまたはWindowedApplicationがルートクラスになる。そしてこれらはDisplayObjectだ。


PAC的にはDisplayObjectはView(本当のPACではPresentation)に含ませたい。
あくまで統一性の問題だが、Viewとロジック(ControlやModel(=Absolution))は切り分けたるためにも、他のエージェントと同じようにしたい。


その方法を2つ考えた。

  1. ViewがApplication/WindowedApplicationを継承し(Application/WindowedApplicationタグがルートになる)、Controlにロジックを埋め込む(ここまでは他のエージェントと同じ)。ただし、ControlのインスタンスはViewから生成する。
  2. ControlがApplication/WindowedApplicationを継承し、ViewはそのControlを継承する(Controlタグがルートになる(実質View=Controlとなる))。

ViewがApplication/WindowedApplicationを継承する方法

この方法ではアプリケーションのルートがViewになるため、全て(のインスタンス)はViewから生成しないといけない。よって普通はControlからViewを生成するとこが、この場合ViewからControlを生成することになる。

View(AppView.mxml)は以下のようになる。



...

Control(ApplicationControl.as)は以下のようになる。

public class ApplicationControl {
//View=Application
private var view:AppView = Application.application as AppView;
...
}

冗長なコードになるが、ルートだけなので混乱はしないと思う。

ControlがApplication/WindowedApplicationを継承する方法

ここでこのアイディアを知った。

code behind

ここでは、MXMLActionScriptを切り分け、リンクさせる方法を書いている。

基本的には、ActionScriptクラスをMXMLで継承するという方法。
これを適用すると下のようになる。

AppclicationControl.as

public class ApplicationControl extends Application {
privatge view:Applicatoin = this; //viewという変数使いたいだけで、必ずしもいらない
public var ti:TextInput;

}

AppView.mxml



...

ただこれは基本的にActionScriptMXMLを切り分けるというアイディアなので、両者は分離してない(2つで1つ)。しかもControl内で操作する必要のあるView内コンポーネントを全てControl内でも定義しないといけない。

どちらかというとViewがApplication/WindowedApplicationを継承する方がいいと思う。FlexBuilderを使っている場合は、Flex/AIRプロジェクトを作る時にMXMLをベースにした雛形ができるので、それにも合わせやすい。