2010-05-07 36 views
0

最近我需要調用一個偵聽器函數沒有實際的監聽器,如下:AS3:性能問題調用帶有空PARAM事件功能

foo(null); 

private function foo(event:Event):void 
{ 
    //do something 
} 

所以我在想,如果有對此之間的性能顯著差異並用下面的,我在其中能防止空呼籲沒有監聽的功能,但我仍然能夠與聽衆也稱之爲:

foo(); 

private function foo(event:Event = null):void 
{ 
} 

我不知道羯羊,這只是一個問題風格,或實際上不好的做法,我應該wr迭代兩個相似的函數,一個和一個沒有事件參數(這看起來很麻煩)。

期待您的意見,thx。

+0

我通常這樣做我自己。它似乎對性能沒有任何影響。它的方式比擁有2個類似的功能更好 - 可管理性更好。 – Shiki 2010-05-07 09:51:03

+2

@Shiki:我不同意。它不分離責任。場景:如果您決定使用該函數作爲事件處理函數,並作爲第一類方法,然後決定,您希望實際評估處理程序中的某些事件數據,則確實存在問題。請看我的帖子的後半部分。 – back2dos 2010-05-07 11:12:44

+0

+1 @ back2dos好點。如果你的處理程序做了很多事情,它確實會促成一個問題。我通常只爲相對較小的功能做這個。 – Shiki 2010-05-08 04:53:35

回答

0

這兩個編譯到完全相同的字節碼。我檢查了一個二進制差異。

+0

偉大的輸入傢伙,非常感謝! – adehaas 2010-05-07 11:18:26

2

由於bitc聲明,沒有區別。請注意,嚴格類型調用中只有這種情況,編譯器可以在編譯時確定默認參數,並實際包含缺省值作爲參數。

當呼叫是無類型的,播放器必須在運行時查找默認參數,與所有需要在運行時執行的運行時類型檢查/轉換相比,這確實花費了一些速度,但可能不應該太多這樣的情況。

但是,這不是一個好的做法。你應該把它分成兩個功能。一個接收事件並從中提取必要的數據,然後將其傳遞給另一個函數,該函數將實際處理它。該函數內的實際邏輯變得更加可重用。重構也變得更容易,因爲您可以簡單地移動該函數(如pull up)而不會破壞代碼。最後但並非最不重要的是,它顯然分離了責任。

當然,如果對事件的實際響應是什麼,既不處理事件也不是太複雜,比分裂有點誇大。

格爾茨
back2dos