2012-11-27 60 views
9

我是編程新手,我一直在檢查很多遊戲編碼教程。我注意到,他們中的大多數人使用自定義事件來觸發方法,而不是直接調用方法。爲什麼使用自定義事件而不是直接方法調用?

這種做法背後的原因是什麼?他們爲什麼不調用這個方法?

例如:


我們有兩個目標:AB。當X條件被觸發時,A具有方法A.methodA()B需要使用。

爲什麼執行:

B調度事件以A告訴A運行A.methodA()

相反的:

B使用A.methodA()

+0

好吧,每當你需要觸發某個方法時,都會引用這個參考,這會讓垃圾收集器的生活變得更簡單=)(他會減少更多的擔心)。 – Ziul

回答

14

主要原因是利益分離。當使用事件時,A類不需要知道B類的存在(反之亦然)。

到這方面的一些好處是:

  • 容易得多單元測試(可以測試A類無B類),打破你的代碼,當你改變A類或B
  • 機會少對代碼中其他類的引用,它減少了內存泄漏的可能性
  • 清除代碼
  • 更靈活/可重用的代碼(其他一些類都可以監聽/響應事件,在調度程序中輸出任何附加代碼)
+4

+1;我還會補充說,事件是一個對象與父對象通信的正確方式。方法調用或公共屬性是父母與孩子溝通的正確方式。 – JeffryHouser

+3

@ www.Flextras.com - 同意,特別是如果兒童班與不同的家長班一起使用。 – BadFeelingAboutThis

2

通常在更大的應用程序中使用事件將有助於抽象化所有事物。當你有15個以上的課程,並且他們都將事件分派給控制器時,通過查看代碼的所有不同部分來跟蹤功能,瞭解發生的事情要容易得多。使用回調開始創建意大利麪代碼。

但是,直接函數調用將比事件執行得更快。

1

就我個人而言,我使用自定義事件只是爲了方便使用。當有事情發生時(例如動畫完成或下載發生錯誤),我可以讓一個類派發一個事件,並且任何數量的其他類都可以根據該事件運行任意數量的其他函數。另外,我爲可重用性編碼。每個類的目標是完全獨立的,因此它可以在任何項目中運行而不需要其他包。因此,不是讓一個類調用另一個類的方法,而是從第二個類偵聽的第一個類派發一個事件,然後運行該方法。然後,當我需要第一個課程用於另一個項目時,我可以複製/粘貼它,而不必修改它並且不會丟失任何功能。

編輯: 另外,值得注意的是,有時候人們會根據你的描述來解決事件參數傳遞的問題。

假設您在舞臺上有一個按鈕,並且您需要能夠點擊它,但是您還需要能夠手動調用該方法。有些人沒有意識到你可以通過一個空的事件,只有一個方法。或者你可以將其設置爲空默認參數,見下圖:

private function onClickHandler(e:MouseEvent = null):void{ 
    //as long as you never reference "e" within this method, this method can be used both for MouseEvent listeners and manually calling it elsewhere in the code 
} 

這種技術可以幫助避免的事件處理程序,只有調用另一個方法而已。在編程的這一點上,我寫的每一個AS3事件處理程序都會默認將event參數設置爲null。它只是讓事情更容易。

1

You might want to read this.

而且還要注意使用回調方法允許你參數通過自定義事件模型,而不是直接傳遞給它。

0

我建立了我自己的,非常簡化的事件調度系統。 AS Event模型功能非常強大,但在99%的情況下,您不需要該功能。將參數作爲事件觸發的簡單回調已經足夠了。您仍然可以保留事件模型的多功能性,但不需要編寫太多的代碼行,比如說一個簡單的按鈕。 我可以設置這樣一個簡單的事件:

Buttonizer.autoButton(_buttQuit, this, "onPress"); 
public function onPressQuit(c:Sprite) { 
// Execution goes here 
} 

你可以建立自己的事件模型,它會讓生活變得簡單,並且代碼簡潔得多。

相關問題