2012-12-21 30 views
0

我正在使用Actionscript3,構建一個類似MMO的遊戲,我負責UI等等。我在很多工作流中使用了事件,但我的合作伙伴建議我改用直接函數調用我的UI資源。這裏有一個例子:我應該在這裏使用直接函數調用而不是事件處理程序嗎?

  1. 我創建了我們使用重新上色用戶的虛擬形象的主要部分的ColorChooser類。
  2. 當你點擊一個顏色,ColorChooser讀取(彩色光譜圖像的)像素點擊和調度一個事件(ColorChooser.COLOR_CHOSEN)。
  3. 我的AvatarDesigner class正在監聽這個事件。
  4. 當事件被分派,處理程序事件AvatarDesigner讀取(e.target爲ColorChooser).chosenColor並應用色彩化身的選定部分。

我的合作者暗示,而不是我:

  1. ColorChooser其父AvatarDesigner對象(_avatarDesigner)的實例。
  2. 當點擊一種顏色,讀取的像素點擊(VAR chosenColor:UINT)和呼叫_avatarDesigner.colorAvatar(chosenColor)ColorChooser對象內。

現在,我的大部分用戶界面都使用事件,這樣我就可以將下拉菜單,按鈕,textareas等資源分離並重復使用。我想我們會將這個ColorChooser對象用於其他事物(ObjectDesigner,WallpaperDesigner,BuildingDesigner)。他說,這將會是更好的每我用它別的時間內ColorChooser添加一個條件,因此,或許這樣的:

private function colorClicked(e:MouseEvent):void { 
    var chosenColor:uint = *the color chosen (bitmapdata.getpixel());* 
    switch(parent){ 
     case AvatarDesigner: (parent as AvatarDesigner).colorChosen(chosenColor); 
           break; 
     case ObjectDesigner: (parent as ObjectDesigner).colorChosen(chosenColor); 
           break; 
     case WallpaperDesigner: (parent as WallpaperDesigner).colorChosen(chosenColor); 
           break; 
     case BuildingDesigner: (parent as BuildingDesigner).colorChosen(chosenColor); 
           break; 
    } 
} 

或者類似的東西(也許不是檢查父,檢查字符串「類型「在構造函數或其他)。這對我來說似乎很奇怪,因爲我不得不重新加入一個案例,每次在別的地方使用。而事件可以觸發它的事件,並且無論它的父母是什麼,它都可以處理或不處理事件。他的一些推理是:

  • 活動應該只用於異步事件或輸入(鼠標,鍵盤)
  • 調度事件和監聽器佔用較多的CPU
  • 直接函數調用的速度更快,因爲它的一部分當前線程,而不是派遣和處理在時間略有不同
  • 的ActionScript3和Away3D中(用於3D)永遠不要使用事件以這種方式

而我覺得事件適當的理由,如:

  • 允許對象保持完全獨立於他們的父母使他們更可重用
  • 我不認爲分派的事件和聽衆佔用更多的CPU(如因爲任何給定的Sprite正在調度在像ENTER_FRAME,MOUSE_OUT,ADDED_TO_STAGE)任何給定的時間很多事件沒有看到性能命中
  • 輕微異步並不重要,如果順序相關的任務發生在聽者的dispatchEvent
  • Away3D中後以這種方式使用它們,我認爲,在挖掘它們的API之後,有點。

任何人都可以對此有所瞭解嗎?每當我在不同類型的父代中使用此資產時,是否可能在新的邏輯條件下進行硬編碼,比如說「ShinyButton」?即使事件和聽衆正在使用CPU,也不會添加這樣的條件使它有點意大利麪呢?

另外,對於我的生活,我無法找到Actionscript3最佳實踐,以便事件好壞,以及爲什麼。另外,如果有人知道事件是如何在低級別上使用的,我很樂意。

感謝您的閱讀!

+0

你是對的,你的朋友在說廢話。他的方法所帶來的任何性能提升都可以忽略不計,正如你所預料的那樣,當你想重新使用你的組件時,緊密耦合將成爲一個問題。 –

+0

感謝您的輸入,net.uk.sweet – Prodikl

+0

最佳實踐的一個很好的參考可能是查看Flex框架中的一些組件的結構。您會發現事件大量用於避免不同組件的緊密耦合。如果你發現類似於你朋友的建議switch語句,那麼我會感到驚訝;) –

回答

1

簡短的回答,我認爲你是正確的,你的朋友是錯誤的。任何感知的性能收益(如果有的話)都可以忽略不計,並且正如您所期望的那樣,將導致難以在其他情況下重用您的組件,並使整個項目更難以維護。

ActionScript是一種基於事件的異步語言,如果你鼓勵他接受它而不是與它對抗,你將會爲你的朋友一個忙。

要回答你關於ActionScript 3.0開發最佳實踐的問題,我認爲你可能會比看看Flex框架的一些組件的結構更糟糕。這些是由Adobe工程師開發的,因此可以被視爲最佳實踐的示範。您會發現大量使用事件以避免不同組件或組件參與者之間的緊密耦合,並最小程度地使用您的朋友建議的那種代碼​​。

3

我認爲你的不同意見是基於習慣而不是真正的原因。

我會personnaly使用個人事件模型,這是我想到的最開放和靈活的解決方案。

但是,如果你要使用回撥功能,無須回到你ColorChooser,你可以創建一個像IColorReceiver有一個名爲像applyColor(color:Color){};(編程最佳實踐說到所需的方法的接口,你應該知道的方法名稱中包含「applyColor」或「choseColor」,而不是形容詞或名稱,如「colorChosen」這doen't意味着很多)

然後在您的colorPicked(e:MouseEvent){}方法動詞更清晰您確保parent實現IColorReceiver,你叫applyColor(chosenColor);除了IColorReceiver之外沒有其他測試。它也可以使用經典繼承,但需要更多的代碼來減少靈活性。

我不提供代碼,但你似乎有一個合理的水平,所以我有信心。 ;)

(希望我的英語是正確的)

+0

嘿那裏帕格,感謝您的輸入!那很有意思。有沒有一個這樣的接口工作的例子,我可以挖掘?這與控制器類似嗎?另外,關於使用動詞是很好的一點。再次感謝 – Prodikl

+0

另外,是的,我認爲習慣起着很大的作用。他正在做很多3D作品,所以他直接與Scene3D,World xml以及其他作品進行了接口。通過使用用戶界面並瞭解按鈕如何處理事件,我接受事件似乎很自然,這對我來說變得很自然。在一天結束時,你會說這兩個都很好? – Prodikl

+0

我會說,如果personnal事件模型正常工作,請使用它!我會說,在一天的開始:)但不要忘記寫一個關於它的文檔! – Pag

相關問題