将现有项目从Flash 7 / AS2迁移到Flex / AS3的最佳方法是什么?
我有一个针对Flash 7的大型代码库,其中包含许多AS2类。我希望我可以将Flex用于任何新项目,但是我们路线图中的许多新内容是对旧代码的补充。
AS2和AS3的语法通常是相同的,所以我开始怀疑将当前代码库移植到Flex / AS3会有多困难。我知道所有与UI相关的东西都是不稳定的(当前,UI是在运行时生成的,其中包含很多createEmptyMovieClip()和attachMovie()东西),但是UI和控制器/模型的东西大多是分开的。
有没有人尝试将AS2代码的大型代码库移植到AS3?有多难?我们遇到了哪些陷阱?对进行此类项目的方法有何建议?
解决方案
回答
我在尝试将大量的AS2类转换为AS3时遇到了一些值得注意的问题:
包裹命名
class your.package.YourClass { }
变成
package your.package { class YourClass { } }
需要进口
我们必须显式导入使用的任何外部类-仅通过其完全限定名称来引用它们是不够的。
接口方法不能标记为"公共"
这完全有道理,但是AS2将允许我们这样做,如果有任何需要将其删除。
明确的"覆盖"关键字
覆盖父类函数的所有函数都必须使用override关键字声明,就像C#一样。同样,如果我们具有扩展其他接口和重新声明函数的接口,则必须删除这些替代(同样,对于public,该表示法毫无意义,但AS2可以使我们做到这一点)。
Flash的所有内置内容已更改
我们在上面已经提到了这一点,但是现在它是flash.display.MovieClip,而不仅仅是MovieClip。此类别中有很多细节,我还远远没有找到所有这些细节,但是这里会引起很多麻烦。
总结
我并没有着手进行这种转换,直到成功为止,但是我能够在几个小时内编写一个快速的Ctool来处理此操作的各个方面,但覆盖关键字除外。自动化导入可能很棘手-就我而言,我们使用的所有软件包均以一些根级别的软件包开始,因此易于检测。
回答
首先,我希望我们不要在项目中使用eval()
,因为AS3中没有等效的东西。
我要做的一件事是逐项浏览Adobe的迁移指南(基本上只是已更改内容的逐项列出),并尝试找出是否可以通过简单的搜索和替换操作(可能使用正则表达式)还是手动编辑与AS3相对应的匹配项是否更容易。可能在很多情况下(尤其是,如我们所说,如果要迁移的代码量很大),最好用脚本编写更改(即使用正则表达式搜索和替换)并手动修复所有边界情况,例如自动更改失败。
准备腾出时间进行一些调试,并通过一些测试用例进行测试。
另外,正如其他人已经提到的那样,尝试将AS2 SWF与AS3 SWF组合起来并不是一个好主意,甚至也不起作用,因此,我们肯定必须一次将所有代码迁移到一个项目中。
回答
从as2迁移这样的更大项目将不仅仅是简单的搜索和替换。新语法非常相似且易于调整(如lilserf所述),但是如果没有其他事实,那就是as3更严格,新事件模型很可能会引起很多问题。通过或者多或者少地从头重写几乎所有内容(可能会使用旧代码作为指南),可能会更好。
从知识上从as2-> as3迁移非常简单。如果我们知道面向对象的as2,那么转到as3根本不是问题。
除非我们特别想要,否则我们仍然不必为UI使用mxml。 Mxml只是提供了一种构建UI(等)的快速方法,但是如果我们想自己使用actionscript进行操作,没有什么可以阻止(如果我们已经在as2代码中包含该UI,这也可能会更容易)。 Flex(Builder)只是一种完成我们可能不想做的事情的快速方法,例如构建UI和绑定数据,但本质上,它只是为我们创建.swf的一部分-它没有魔力;)
回答
以下是从AS2迁移到AS3的一些其他参考:
格兰特·斯金纳斯AS3工作坊入门幻灯片
http://gskinner.com/talks/as3workshop/
Lee Brimelow:学习ActionScript 3的6个理由
http://www.adobe.com/devnet/actionscript/articles/six_reasons_as3.html
Colin Moock:基本ActionScript 3(被ActionScript开发人员视为"圣经"):
http://www.amazon.com/Essential-ActionScript-3-0/dp/0596526946
迈克·钱伯斯
回答
我的经验是,迁移到AS3的最佳方法是从两个阶段开始,即结构化和语法化两个阶段。
首先,进行几轮重构,以保留在AS2中的位置,但要尽可能地接近AS3体系结构。自然地,这包括将所有框架脚本和#include脚本移动到包和类中,但是我们可以做一些更细微的事情,例如更改所有事件侦听器和调度程序以遵循AS3流程(对事件类型使用静态类属性,并通过方法进行注册而不是按对象)。我们还希望摆脱所有"内置"事件(例如onEnterFrame),并仔细研究鼠标的非平凡交互(例如拖动)和键盘交互(例如检测是否按下一个键)。此阶段可以逐步完成。
第二阶段是从AS2转换为AS3,将" _x"更改为" x",以及所有API,依此类推。这不能增量完成,我们必须一口气完成尽可能多的工作,然后开始修复所有编译错误。因此,在第一阶段中我们可以做的越多,在第二阶段中就可以避免越多的痛苦。
这个过程对我来说是一个相当大的项目,但我应该注意,第一阶段需要对AS3的结构有深入的了解。如果我们不熟悉AS3,则可能需要尝试构建一些需要移植的功能。例如,如果旧代码使用拖放目标,则需要尝试在AS3中实现该目标,以了解代码将如何在结构上进行更改。如果我们随后牢记重构AS2,则最终语法更改应该会顺利进行。
对我来说,最大的陷阱是涉及许多添加,复制和移动MovieClip的部分,以及更改其深度等等。所有这些东西实际上都无法重新构造为看起来像AS3. 我们只需将所有内容融合到新的思维方式中,然后开始修复错误。
最后一点,我真的不会担心诸如import和override语句之类的事情,至少不必担心使其自动化。如果我们错过了任何内容,它将被编译器捕获。但是,如果我们错过了结构性问题,我们将遭受更多的痛苦。