withブロックの使い道
withとは、特定のスコープに一時的にフォーカスして処理を一括して書けるものです。
主に見た目をスッキリする感じで使われることがおおく、 使い道としては描画系メソッドをまとめて書くくらいしか目にしません。
with( mc ){ lineStyle( 1, 0xff0000 ); moveTo( 0, 0 ) lineTo( 100, 100 ); }
これはスコープを柔軟にできるがゆえに混乱やバグのもとになるため、 作法として避けたほうがよいというのがあるのだと思います。
あまり使わないがゆえにすっかり忘れてましたが、そういう長短をふまえて使えば意外に便利ですよ。
という例です。
class BoxMC extends MovieClip { public var btn_close:MovieClip; public function visibleAll( visibility:Boolean ):Void { with( this ) { header_mc._visible = visibility; border_mc._visible = visibility; footer_mc._visible = visibility; headline_mc._visible = visibility; } } }
上記はMCを拡張したクラスを作るケースです。
MCはもともとダイナミック(動的)なクラスなので、変数宣言不要でガンガンいろんなプロパティやメソッドを拡張できてしまいます。
ですが、サブクラスではダイナミック宣言しない限りそのMCの子MCもすべて変数として宣言しておかないとコンパイルエラーになります。
たとえば一回しか出現しない子MCが多い場合や、 一時的な処理のために(意味的に)半端なプロパティを大量に増やすのは 何かキモいなーっていうときがあると思います。
コンパイルエラーを避けるだけなら、this["footer_mc"]のようにブランケット演算子でも可能です。
しかし、かなり見づらく修正しにくいので、ここでwithブロックで一括してやればスッキリします。
結構小手先のハックではありますが、子MCの制御に絞ってしまえば、スコープが変に入り乱れることもないので安全かと思います。
補足:
ただし、そもそもこういうことが起こるのは、MVCが上手にできてない、というお話。
MCのサブクラスが外見に徹していればプロパティを増やすことはそんなに不自然じゃないですよね。(やはり面倒という一点において微妙な感じはしますが)
誰かの作ったカオスなコードを改変するとか、自作ボタンなど細かい拡張にクラスを2つも3つもつくりたくないよっていう事例に限るなど、あくまでハックとしてわきまえてつかうことが大事だと思います。