2011-07-28 14 views
2

私はより多くのイベント駆動型環境に慣れていますが、私は現在作業中のコピーを関数呼び出しのバックとしてすべて使います。私はこのデベロッパーについて尋ねたところ、バブルのためにコールバックが速かったためだと言いましたが、バブリングプロパティは常にfalseに設定できました...ファンクションコールバックを見つけるための速い方法...

だから私はコールバック関数が参照されています。例えば

public class A { 
    public function A(){} 
    public function func_1():Number{ return 1; } 
    public function func_2():Number{ return 2; } 
    public function doSomething:Function{ 
     if(Math.random > 0.5) return func_1; else return func_2; 
    } 
} 

その後、私はクラスBでコードを実行する可能性があります

public class B{ 
    public var a:A = new A(); 
    private var action:Function; 
    public function B(){ action = a.doSomenthing(); } 
} 

私はBI内のブレークポイントを置くときに(34567 @)アクション=関数を取得しています本当に完全に役に立たない...私はfunc_1とfunc_2の両方にブレークポイントを置くことができることを実現しますが、私はこれを一般的な例として使用しています。関数コールバックがコードを振りかざしています...名前を取得する方法はありますか関数のメモリアドレスによる?ありがとう

私はあなたがスタックトレースについて何を言っているのか分かります。しかし、コード内の関数を物理的に踏み越えなければなりません。以下の例では、コールバック()にブレークポイントを置く必要があります。スタックトレースの更新を確認するためにステップオーバーします。問題は、呼び出される前にコールバックを知りたいということです。時には他の場所で呼び出されることもあります。コールバックを取得する他の方法はありませんか?

public var callbacks:Array = []; 
public function loadURL(url:String, callback:Function){ 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
    callbacks.push(callback); 
    var request:URLRequest = new URLRequest(url); 
    loader.load(request); 
} 

public function completeHandler(event:Event):void 
{ 
    for(var i:int = 0; i < callbacks.length; i ++){ 
     var callback:Function = callbacks[i]; 
     callback(); 
    } 
} 
+0

ルック:

そして、ここでは、後世のためのコードの技術です。 –

+0

私はあまりにも時々コールバックを使用しますが、私もasdocコメントを使用しているので、以前は何の問題もありませんでした。また、コールバックはクラス内の 'Function'型の唯一の変数かもしれないので、それらを識別するのは簡単なはずです。私はあなたの例が公共のプロパティを使用しているのを見ます。私は保護された変数とgetter/setterを使用しています。それが助けになると、次のようなことができます: 'public function getFunctionVars(instance:*):XMLList { \t \t \t return describeType(インスタンス).method。(@ returnType ==" Function "); \t \t} '...しかし、理想的には、あなたが扱うコードはできるだけ単純で文書化されるべきです –

答えて

2

これは信じられないほどグラグラコードであるが、この例のために、デバッガからのコールスタックを使用することができます。

enter image description here

あなたのコード例では、多くの問題があったが、このキャプチャはマイナーに基づいています

package 
{ 
    import flash.display.Sprite; 

    public class MultiCallback extends Sprite 
    { 
     public function MultiCallback() 
     { 
      super(); 

      var b:B = new B(); 
      b.action()(); 
     } 
    } 
} 


internal class A 
{ 
    public function A() 
    { 
    } 

    public function func_1():Number 
    { 
     return 1; 
    } 

    public function func_2():Number 
    { 
     return 2; 
    } 

    public function doSomething():Function 
    { 
     if (Math.random() > 0.5) 
      return func_1; 
     else 
      return func_2; 
    } 
} 

internal class B 
{ 
    public var a:A = new A(); 

    public var action:Function; 

    public function B() 
    { 
     action = a.doSomething; 
    } 
} 
1

男私は同じボートにいます。このコードベースは膨大で、同じ方法で実行されます。私の場合、「散らばっている」ことは控えめなものになります。関数オブジェクトに関数名ハンドラがない場合、あなたはSOLです。私がコードを理解する方法の1つは、この異なるクラスを表現するためにUMLを使用し、これが何かを呼び出すことを示す連想演算子を使用することでした。コールバックが別のコールバックを呼び出すときに失われるのはとても簡単です。あなたが作ったUML図を持っていることは、ウサギの穴の中から自分自身を取り出そうとしているパン粉のようなものです。しばらくすると、あなたはそれに慣れます。私はこのプログラミング方法を採用するだろうか?地獄いいえ、彼らは次の男が維持するのが難しくなったばかりです。私はViolet UMLを使用して、コールバックの旅を追跡します。

2

try ... catchの中にエラーを投げて、アプリケーションを強制終了せずにスタックを検査することができます。この解決策は、私をひどくしますが、同時にそれは非常に狡猾です。もともとRalf Bokelberkによって、しかし彼のブログは現在私がそれを見つけたところでI'll link to here insteadを働かないので、デバッガからのコールスタックで

var stackTrace:String; 

try { throw new Error(); } 
catch (e: Error) { stackTrace = e.getStackTrace(); } 

var lines:Array = stackTrace.split('\n'); 
var isDebug Boolean = (lines[int(1)] as String).indexOf('[') != int(-1); 

var path:String; 
var line:int = -1; 

if (isDebug) { 
    var regex:RegExp = /at\x20(.+?)\[(.+?)\]/i; 
    var matches:Array = regex.exec(lines[int(2)]); 

    path = matches[int(1)]; 

    //file:line = matches[2] 
    line = matches[int(2)].split(':')[int(2)];//windows == 2 because of drive:\ 
} else { 
    path = (lines[int(2)] as String).substring(4); 
} 
関連する問題