2012-02-16 11 views
0

イベントリスナーを追加して対応する関数を定義するとき、自分自身がコンストラクタのコードで関数を多く定義しています。このようなもの:AS3 - 他の関数の中で関数を定義する

package 
    { 
     public class stuff extends Sprite 
     { 
      public function stuff() 
      { 
       minimizeBtn.addEventListener(MouseEvent.CLICK, minimizeOnClick); 
       function minimizeOnClick(e:MouseEvent):void 
       { 
         //do minimization stuff here 
       } 
      } 
     } 
    } 

ただし、他のクラスのメソッドと同じように定義することもできます。

package 
    { 
     public class stuff extends Sprite 
     { 
      public function stuff() 
      { 
       minimizeBtn.addEventListener(MouseEvent.CLICK, minimizeOnClick); 
      } 

      internal function minimizeOnClick(e:MouseEvent):void 
      { 
       //do minimization stuff here 
      } 
     } 
    } 

2番目のオプションは実際にはクラスのメソッドではないため実際には意味がないかもしれません。しかし、私の懸念は、最初のメソッドは、クラスの各インスタンスのために余分なメモリを使い切ることです。これを行う最も効率的で正しい方法はどれですか?また、最初のメソッドは、クラスの各インスタンスに対して余分なメモリまたはCPU時間を消費しますか?

ありがとうございます!

+0

コンストラクタをできるだけシンプルにするのが理想的です(定義したinit()プライベートメソッドを多く呼び出す必要がある場合)、リスナー(minimizeOnClick)をプライベート関数として持つのが最も簡単な解決策です私の意見では –

+0

ありがとうGeorge。私は他の人がコンストラクタをシンプルに保つと言うことを見てきました。コードの可読性以外の理由はありますか? init関数を使用するとオーバーヘッドが増えます(わずかなCPUサイクルしかないため、ほとんどありませんが、まだまだです)。 ASのコンストラクタは、CまたはJavaのコンストラクタとはかなり異なるものですか? –

+0

[ActionScript 3最適化技術](http://je2050.joa-ebert.com/files/misc/as3opt.pdf)の[Joa Ebert](http://blog.joa-ebert.com/)によると、コンストラクタ内のコードはJIT(Just-In-Time Compiler)によって最適化されていません。JIT最適化されたコードを使用するには、コンストラクタから関数を呼び出す可能性があります。要するに、Actionscript Virtual Machine(AVM)はC/Javaとは異なる動作をします。 –

答えて

1

後者の例は正しい方法です。関連するクラス内にaddEventListener()とリスニング関数をカプセル化してください。あなたのケースでは、あなたminimizeBtnのクラスを行うことを検討することもできます。

public class MinimizeButton extends SimpleButton 
{ 

    public function MinimizeButton() 
    { 
     addEventListener(MouseEvent.CLICK, _onClick); 
    } 

    private function _onClick(e:MouseEvent):void 
    { 
     // do minimization stuff here 
    } 

} 

MinimizeButton_onClick()そこから行う必要があるものは何でもstuffクラスstuffと実行の関連するインスタンスをターゲットとすべきです。

この例のプロセスは、よりのようなものです:

MinimizeButton:「私がクリックされましたが、私はそれが関連する何かを行うことができますstuffに通知する必要があります。」

むしろより:

stuff:「私は、私が必要と何やる、座っているとMinimizeButtonがクリック取得するのを待つつもりです。」