Apache flex 将现有项目从Flash7/AS2迁移到Flex/AS3的最佳方法是什么?

Apache flex 将现有项目从Flash7/AS2迁移到Flex/AS3的最佳方法是什么?,apache-flex,flash,actionscript-3,porting,Apache Flex,Flash,Actionscript 3,Porting,我有一个针对Flash7的大型代码库,有很多AS2类。我希望我能够在任何新项目中使用Flex,但我们的路线图中有很多新东西是对旧代码的补充 AS2和AS3的语法基本相同,因此我开始怀疑将当前代码库移植到Flex/AS3有多困难。我知道所有与UI相关的东西都是不确定的(目前UI是在运行时生成的,包含大量createEmptyMovieClip()和attachMovie()的东西),但UI和控制器/模型的东西基本上是分开的 有人尝试过将AS2代码的大型代码库移植到AS3吗?有多困难?你遇到了什么样

我有一个针对Flash7的大型代码库,有很多AS2类。我希望我能够在任何新项目中使用Flex,但我们的路线图中有很多新东西是对旧代码的补充

AS2和AS3的语法基本相同,因此我开始怀疑将当前代码库移植到Flex/AS3有多困难。我知道所有与UI相关的东西都是不确定的(目前UI是在运行时生成的,包含大量createEmptyMovieClip()和attachMovie()的东西),但UI和控制器/模型的东西基本上是分开的


有人尝试过将AS2代码的大型代码库移植到AS3吗?有多困难?你遇到了什么样的陷阱?有没有关于执行此类项目的方法的建议?

在尝试将大量AS2类转换为AS3时,我发现了一些值得注意的问题:

包命名 变成

package your.package
{
    class YourClass
    {
    }
}
需要进口 您必须显式地导入所使用的任何外部类——用它们的完全限定名引用它们已经不够了

接口方法不能标记为“public” 这是完全有道理的,但AS2会让你这样做,如果你有任何他们将需要删除

显式“覆盖”关键字 任何重写父类函数的函数都必须使用override关键字声明,就像C#。同样,如果您有扩展其他接口和重新声明函数的接口,则必须删除这些重写(同样,与public一样,这种表示法没有任何意义,但AS2允许您这样做)

所有Flash内置的东西都变了 您在上面提到过这一点,但现在它是flash.display.MovieClip,而不是MovieClip。在这一类中有很多细节,我没有找到足够多的细节,但是这里会有很多麻烦

结论
我没能成功地完成这一转换,但我能在几个小时内编写一个快速的C#工具,它可以处理除override关键字之外的所有方面。自动导入可能很棘手——在我的例子中,我们使用的包都是从几个根级别的包开始的,因此它们很容易检测。

首先,我希望您在项目中没有使用
eval()
,因为在AS3中没有等效的包

我要做的一件事是逐项检查(基本上只是更改内容的逐项列表),并尝试找出是否可以通过简单的搜索和替换操作(可能使用正则表达式)更改每个项目,或者是否更容易手动编辑事件以对应于AS3。可能在很多情况下(特别是如您所说,如果要迁移的代码量相当高),您最好编写更改脚本(即使用regex search&replace)并手动修复自动更改失败的任何边界情况

准备好留出一些时间进行调试和运行一些测试用例


另外,正如其他人已经提到的,尝试将AS2 SWF与AS3 SWF结合起来不是一个好主意,甚至不起作用,因此您肯定必须一次在一个项目中迁移所有代码。

从AS2迁移这样一个更大的项目将不仅仅是一个简单的搜索和替换。新的语法非常相似,而且适应起来也很简单(正如lilserf所提到的),但是如果没有其他原因的话,as3更加严格,新的事件模型很可能会导致很多问题。您可能会从零开始或多或少地重写几乎所有内容,并可能使用旧代码作为指导,从而获得更好的结果

不过,从as2->as3迁移知识相当简单。如果您了解面向对象的as2,那么转到as3根本就不是问题


除非您特别想要,否则您仍然不必在UI中使用mxml。Mxml只是提供了一种快速构建UI(etc)的方法,但是如果您想自己使用actionscript来实现这一点,没有什么可以阻止您(如果您已经在as2代码中拥有该UI,这可能会更容易)。Flex(Builder)只是一种快速的方法,可以完成您自己可能不想做的事情,例如构建UI和绑定数据,但本质上它只是为您创建.swf的一部分——这没有什么神奇之处;)

以下是从AS2迁移到AS3的一些附加参考:

格兰特·斯金纳介绍性AS3研讨会幻灯片

李布里梅洛:学习动作脚本的6个理由3

Colin Moock:Essential ActionScript 3(被认为是ActionScript开发人员的“圣经”):

迈克·钱伯斯


mesh@adobe.com

我的经验是,迁移到AS3的最佳方式分为两个阶段——第一个是结构上的,第二个是语法上的

首先,在AS2中进行多轮重构,但尽可能接近AS3体系结构。当然,这包括将所有框架脚本和#include脚本移动到包和类中,但您可以做一些更微妙的事情,如更改所有事件侦听器和分派器以遵循AS3流(对事件类型使用静态类属性,并按方法而不是按对象注册)。您还需要清除所有“内置”事件(如OneInterFrame),并仔细查看非平凡的鼠标交互(如拖动)和键盘交互(如检测是否按下键)。这个阶段可以逐步完成

第二个阶段是从AS2转换到AS3——将“x”更改为“x”,以及所有API,依此类推。这不能以增量的方式完成,您必须一次完成尽可能多的工作,然后开始修复所有编译错误。因此,在第一阶段你能做的越多,在第二阶段你就越能避免痛苦

在一个相当大的项目中,这个过程对我很有效,但我应该注意到
package your.package
{
    class YourClass
    {
    }
}