GoTheDistance

ござ先輩と言われています。(株) クオリティスタートという会社をやっています。

Flash採用時に注意すべきこと

あたりまえのFlashよりTB

このエントリの中で思ったことを引用しつつメモ。

Flash技術者の確保について

自分も自社以外のリソースを求める時は少なくとも人材派遣の会社にアクションスクリプトを「使える」エンジニアを期待することは考えられません。

私も同感。ウチの会社に来て初めてFlash触りました!ってヒトが多いし、何しろ組織的にFlashを使用しているJava圏のSIerは圧倒的に少ない。

Flashでコードを書く時の注意

某デザイナー系会社の方のFlashソースを見たことがあるのだが、なかなか香ばしいつくりになっていた。

端的に言うと、GUIコンポーネントとロジックが密接にくっついていた。VBのようにコンポーネントに対してイベントドリブンでコードを書く、あのままのスタイル。この方法は、GUIの変更がモロにロジックの修正に結びついてしまい、責務の分離が難しくなり同じようなコードが生み出され、絶妙のバランス感覚でアプリが動くという大変よろしくない結末が待っている。

Flash MX 2004では「リンケージ」と呼ばれる機能がある(MXでもあるかもしれん)。ロジックを別ファイルに外出しして、コンポーネントにバインドする機能だ。せめてこれだけでも行ってやると可読性が格段に向上する。

どう違うかっていうと、こんな感じ。

■リンケージ

Sample.as

public Sample extends MovieClip

 private var sample_btn:mx.controls.Button;

 public Sample() {
   this.sample_btn.onPress = fucnction() {
      trace("My name is" + _this.name);
   }
 }

■直書き

(onPress) {
  trace("My name is" + _this.name);
}

一見後者でもいいじゃんって思うかもしれませんが、こういったコードが部品毎に存在していることを考えると、どこに何があって全体の処理の流れはどうなっているのかを把握するのが死ぬほど困難になります。
ロジックは外に出しましょう。つーかお願い!

Flashのパフォーマンス

よくFlashを使っているサイトに行くと、CPU使用率がテラタカスになることがあります。その理由を解説しているのがこの記述。

パフォーマンス問題は、Flashでは一番重要なポイントになります。

Flashは作り方でいくらでも遅いものを作ることができますので、設計段階でオブジェクトの使い方に関しては十分考慮する必要があります。

主に描画に関することではないでしょうか。特にフレームアクションで大量のムービークリップの描画制御を書くなど避けなくてはいけません。1/15秒のタイマーをぶん回してひたすら描画し続けるような動作になりますので、すぐにCPU使用率が100%になります。

Flashを良く知らない人間ほど、Flashのパフォーマンスの罠にハマる。ここは最も留意すべき点です。ただ部品を貼り付けたら完成じゃないんだって。生産性が単純に高くなるとか盲目的に考えちゃいけないんだって<某社のエロいおっさん

注意すべきは描画系の処理です。全ての部品は描画処理の集合体と考えるべきでしょう。

例えば、グリッドのセルにレンダラーを定義している場合などは気をつけましょう。画面のイニシャライズ時にdrawメソッドがCallされるので、それ以降はdrawしないという管理を行わないとグリッドのセル単位でdraw()がCallされます。100個のセルを表示するアプリだったら、グリッドのスクロールが発生するたびに100個のセルのdraw()が走ると言うことです。

draw()が走るのはしょうがないんで、空Returnなどするとして逃げましょう。

それなんてVB

FlashをVBと同一視するファンキーな方も見受けられますが、勘弁して頂きたい。VBVB、FlashはFlash。GUIベースの開発が可能と言う物凄い狭い共通点だけで、全てが同一であるかのような思考は捨てましょう。赤字案件へ最高のスタートを切ることになります。

おまけのTips

Flash開発で絶対一度はハマるのが、ターゲットパスの概念です。

public Class Hoge {

	private var params:LoadVars;

	function init() {
	  params.onData = doSomething;
	}

	function sayHello() {
	  trace("hello");
	}

	function doSomething() {
	  sayHello();
	}

}

ってコードがあるとします。

このままでは、doSomething()と言う処理は一生走りません。

sayHello()はhogeクラスがthisになるが、doSomething()はparamsがthisになるからです。同じ場所にソースを書いているのにthisの参照先が違うなんて恐ろしいでしょw