我应该在这里使用直接函数调用而不是事件处理程序吗?
我正在使用Actionscript3,构建一个类似MMO的游戏,我负责UI等等。我在很多工作流中使用了事件,但我的合作伙伴建议我改用直接函数调用我的UI资源。这里有一个例子:我应该在这里使用直接函数调用而不是事件处理程序吗?
- 我创建了我们使用重新上色用户的虚拟形象的主要部分的ColorChooser类。
- 当你点击一个颜色,ColorChooser读取(彩色光谱图像的)像素点击和调度一个事件(ColorChooser.COLOR_CHOSEN)。
- 我的AvatarDesigner class正在监听这个事件。
- 当事件被分派,处理程序事件AvatarDesigner读取(e.target为ColorChooser).chosenColor并应用色彩化身的选定部分。
我的合作者暗示,而不是我:
- 给ColorChooser其父AvatarDesigner对象(_avatarDesigner)的实例。
- 当点击一种颜色,读取的像素点击(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最佳实践,以便事件好坏,以及为什么。另外,如果有人知道事件是如何在低级别上使用的,我很乐意。
感谢您的阅读!
简短的回答,我认为你是正确的,你的朋友是错误的。任何感知的性能收益(如果有的话)都可以忽略不计,并且正如您所期望的那样,将导致难以在其他情况下重用您的组件,并使整个项目更难以维护。
ActionScript是一种基于事件的异步语言,如果你鼓励他接受它而不是与它对抗,你将会为你的朋友一个忙。
要回答你关于ActionScript 3.0开发最佳实践的问题,我认为你可能会比看看Flex框架的一些组件的结构更糟糕。这些是由Adobe工程师开发的,因此可以被视为最佳实践的示范。您会发现大量使用事件以避免不同组件或组件参与者之间的紧密耦合,并最小程度地使用您的朋友建议的那种代码。
我认为你的不同意见是基于习惯而不是真正的原因。
我会personnaly使用个人事件模型,这是我想到的最开放和灵活的解决方案。
但是,如果你要使用回拨功能,无须回到你ColorChooser
,你可以创建一个像IColorReceiver
有一个名为像applyColor(color:Color){};
(编程最佳实践说到所需的方法的接口,你应该知道的方法名称中包含“applyColor”或“choseColor”,而不是形容词或名称,如“colorChosen”这doen't意味着很多)
然后在您的colorPicked(e:MouseEvent){}
方法动词更清晰您确保parent
实现IColorReceiver
,你叫applyColor(chosenColor);
除了IColorReceiver
之外没有其他测试。它也可以使用经典继承,但需要更多的代码来减少灵活性。
我不提供代码,但你似乎有一个合理的水平,所以我有信心。 ;)
(希望我的英语是正确的)
你是对的,你的朋友在说废话。他的方法所带来的任何性能提升都可以忽略不计,正如你所预料的那样,当你想重新使用你的组件时,紧密耦合将成为一个问题。 –
感谢您的输入,net.uk.sweet – Prodikl
最佳实践的一个很好的参考可能是查看Flex框架中的一些组件的结构。您会发现事件大量用于避免不同组件的紧密耦合。如果你发现类似于你朋友的建议switch语句,那么我会感到惊讶;) –