Flexでのロジックとビューの分離

Flexでロジックとビューの分離は結構悩むところだ。


以下、完全に僕が半年弱いじってきた上の経験則で、
もしかしたらFlexフレームワークの向上で改善されていることもあるかもしれない。

  • スピードを重視しFlexの生産効率を最大限に発揮することを考えたら、間違えなく「分離しない」が正解

MXMLのScriptタグにロジックを書きまくって、
addEventListenerなんてしないで、タグに直接change="onChange()"とかclick="onClick()"とか書いていく
値もひたすらvalue="hoge.fuga"見たいにしていけば良い。

でも、これには大きな落とし穴がある。

  1. EventListnerの操作がしずらく、ガベージコレクションを効かせる為の参照の解除がわからなくなる。
  2. デザイナーがいじれなくなる(一人でやっていても微修正が困難になってくる)
  3. ASDocの生成がちゃんとできない

正直これはASDocが生成できない上に使い回しが効かないなど、論外だと思う
純粋に別ファイルに出来ればいいならありだけど、全く使わない




開発効率とASDocを良いバランスにする場合

  • mxml内でIMXMLObjectを実装したクラスを読み込ませる方法

このときViewとLogicではidを決めておけば、完全に分離することが出来る。
また、メンバ変数にコンポーネントを定義せずに、documentオブジェクトの参照から、
全要素にアクセスできるのでいたって使いやすい。

またFlexBuilderならCtrl+Spaceで保管も効くので便利だ。


今までの6割はこれを使ってきた。


但しこれには弱点がある。

他のコンポーネントからメソッドにアクセスするときに、ちょっと不便だったり。
ロジックとビューの相互関係のせいで、参照を消しきれなくガベージコレクションが効かないことがある。
また、別名で全く同じ処理をするViewの複製を作ることが出来ない。


それを理解した上で、コンストラクタ以外全てprivateだったりするようなコンポーネントには非常に有効だと思う。

開発効率は圧倒的に低くなるが、保守などを考えていくと結果的にベストだと思います

これだと、コンポーネントに配置するレイアウト系以外の全要素をメンバ変数に定義しなきゃいけないけど、
例えばCanvasのサブクラスとしてロジックを作成し、Viewで継承すると、色んなパターンのデザインを作ることが出来る。

また、外からのアクセスする場合はmxmlのオブジェクトとして出なく、
Logicクラスのサブクラスとして参照を取得すれば、扱いが非常にしやすくなる。



結局mxmlにはデザイン要素とid以外は絶対に書かなければ、
後から処理をしたりドキュメントを作ったり、ロジックのみ拡張させるときに幸せに慣れるということが言いたい