将应用程序从AS2迁移到AS3有哪些优缺点?

3
我有一个客户问我:“从AS2 / Flash升级到AS3 / Flex有什么优缺点?”他的应用程序存在性能和可维护性问题。
我有点讨厌这些问题,因为我只想说“AS3 / Flex会更快,更易于维护”,但我知道我应该更具体。该应用程序接近10万行代码,文档不全面,UI似乎都是动态生成的。
显然,从Flash / AS2迁移到Flex / AS3将很昂贵,但是为了提高速度和可维护性是否值得?有人知道它会在多大程度上提高速度和可维护性吗?在AS3中有什么事情是你不能在AS2中做到的吗?我猜没有。在AS3中真的有重要的事情是你不能在AS2中做到的吗?
我想这个问题的后半部分是当与客户打交道时如何正确回答这些问题?除非花费很多时间查看成千上万行的代码,否则我不确定我可以非常准确地回答。
谢谢!
9个回答

3

性能 若你的代码有10万行,将其在比现有VM快10倍的VM上运行(正如Adobe所说)会明显提升性能。但是,如果当前应用程序的性能已经足够好了,那么你真的不需要考虑这个问题。

可维护性和可重用性 如果当前代码库难以维护且不可重用,则需要进行重构,而不是使用新语言重写。AS3鼓励编写有助于可维护性和可重用性的编程实践,但这并不意味着你和你的团队会遵循这些实践。使用AS3也可能导致你得到一个难以维护的代码库。 AS2代码也可以以可维护和可重用的方式进行重构。

新技术 我认为这是唯一真正的优点。Flex / AS3是一种新技术。它很好而且干净。很多人强烈支持它。Adobe正在推动所有人从AS2切换到AS3。将来将越来越难以雇用AS2开发人员。支持AS2的开发工具将越来越少。我猜你迟早都要做出这个转变。

因此,在所有人列出的利弊方面,我认为你需要让客户明白,如果你想经常更新应用程序,这必须早日完成。但我认为你没有必要急于做出这个转变。


“你说的“我认为你不应该急于做那个。”是什么意思?”? 应用程序的新架构将是多个swf,所以您是建议首先将架构转换为多个swf,然后在我们开始时更新每个swf到AS3吗? 似乎很难让AS3 swf与AS2 swf交流.....” - Tony
不要这样做,管理AS2和AS3代码会非常混乱,而且整合基于AS2和AS3的SWF文件会遇到很多问题。 - Ammar

2
维基百科有一个不错的Adobe Flash Player版本新功能列表:http://en.wikipedia.org/wiki/Adobe_Flash_Player。从第9版开始,只能使用AS3。以下是一些亮点,包括我自己添加的一些内容:
- 支持Flex 2+(第4版将于明年年初推出) - 支持Adobe AIR - 二进制套接字 - H264 / AAC支持 - 三维变换 - 新文本布局引擎 - 硬件加速
我曾经编写过在FP8(Flex 1.5)和FP9+(Flex 2+)下运行的Flex应用程序,我可以告诉你它跑得快多了。对于那些每天花费大量时间在业务应用程序中的人来说,这可能是一个明显的改进,可以减少最终用户的烦恼。虽然有低级操作(如字符串连接和数组排序)的性能指标,但这些指标并不能等同于在现实世界应用程序中看到的性能提升。实际上,它们会更小,但是可以衡量。
最终,您能做的最好的事情就是估算维护当前应用程序与重写并添加后续功能的成本。如果他们计划在应用程序中做出很多更改,那么重写可能不值得。但是,如果应用程序正在添加许多功能,并且您觉得使用Flex和AS3可以显着提高生产力,那么您应该能够向他们展示数字,让他们基于此做出决定。

只有拥有适当显卡的机器才能进行硬件加速(具体是哪款显卡我记不太清了,但它只是市面上所有显卡的一个子集)。 - Marius

2
升级的最大和最重要的原因是,据Adobe所说,AS2是一种死语言。AS2在其自己特殊的VM(准确地说是AVM1)中运行,与Flash 8世界中的其他Flash播放器永远停留在一起。没有新功能或优化将回到AS2 - 完全不可能。
此外,如果这个应用程序将长期存在,了解和理解AS2的开发人员数量只会随着时间的推移而减少。如果跳转到AS3将在应用程序中发生,那么越早做越容易(也可能更便宜)。

我从未过多考虑虚拟机(VM)运行的AS。对我来说,AVM应该驻留在Flash播放器中才是合理的...正确吗?因此,如果用户已安装Flash10并使用此AS2应用程序,那么该应用程序是否将在最新的AVM上运行,只是不能获得最新功能的好处呢? - Tony
所有Flash Player版本9及以后实际上都内置了2个虚拟机(VM)。如果您正在使用AS3,无论您针对哪个版本的播放器,都将使用AVM2。如果您使用AS2,则将被限制在AVM1中 - 再次无论您针对哪个版本的Flash。 - Branden Hall

1
AS3比AS2更优秀-有很多原因,包括VM性能、更严格的编译器来强制执行更干净的编码实践(如严格类型等)。我没有看到任何人提到在AS3中可以在运行时更改对象的父对象,而在AS2中你无法这样做,如果你遇到了这个问题,你知道这是一个多么令人失望的障碍。
但更重要的是,当你用AS3编写代码时,它们按照预期工作。没有这种古怪的AS2东西,你会经常发现代码限制导致的错误、缺陷和奇怪的结果!
如果你考虑移植/重写,你还应该考虑你的开发团队是否熟悉AS2而不是AS3所需的任何学习曲线。
对于一个有10万行代码的代码库(按任何ActionScript标准都非常庞大),除非代码被记录、优雅和组织良好,否则移植将是一场噩梦。也许你会发现,从头开始重新构建一个更高效、更有组织的框架/设计模式来构建应用程序,最终可以显著减少代码库的大小...也许只需要50000行代码库就足够了?
祝你好运!

1
其他回答已经涵盖了基本要点,但我想补充一下:就性能而言,对于编写良好的 AS3 代码,脚本执行速度通常比 AS2 快 3 到 100 倍不等。这取决于具体的操作。但需要注意的是,对于大多数应用程序来说,性能问题并非完全或主要由脚本执行导致的。通常来说,渲染是最大的瓶颈,此时切换到新的 AS3 虚拟机可能会带来中等效益,或者甚至没有任何效益。只有通过分析才能确定您的特定应用程序是否能够看到显著的性能改进。
但这只是为了扩展讨论。我同意其他评论者提出的最大问题是,许多新功能仅适用于新 VM。请记住,这不仅仅是语言切换的问题——Flash 播放器目前有两个不同的虚拟机,而 AS2 VM 实际上现在是一个遗留应用程序。
其他人没有涵盖的另一件事是,AS2 和 AS3 内容之间的互操作性非常差。如果你可能会加载外部内容(SWF)或尝试使用第三方库(图形组件或类似的东西),那么你可能会发现大多数这样的内容已经是 AS3 了,而 AS2 的东西只会越来越少。

1
我从未使用过任何特定的工具 - 我只是制作小型一次性框架,在执行繁重的代码操作之前和之后,类向监视器类注册,并累加结果。但在我参与的项目中,除了极少数情况外,脚本执行的性能都被渲染所超越,而渲染又非常难以进行分析。实际上,我最好的方法就是逐个排除并比较 - 例如,如果您怀疑某个组件很慢,请尝试删除其内容并编译,看整体性能是否有所改善,等等。 - fenomas

0

我个人无法忍受AS2,所以在3之前完全避免使用这种语言。其他人已经发表了很多原因,但以下是我能想到的一些快速列表:

  • 更容易创建可重用代码
  • 可以遵循生产测试的最佳实践
  • 访问坚实的微架构框架(Robotlegs、Swiz、PureMVC、Mate、Parsley等)
  • 提高速度
  • 不仅限于Flash或Flex,可以访问两个组件库
  • 利用新的播放器功能
  • 访问as3带来的大量库
  • 能够使用即将推出的技术,如Flash Catalyst
  • 强大的IDE提高效率和与大型团队合作的能力
  • 不再被时间轴束缚。

对我来说,选择不是Flash/AS2和Flex/AS3 - 你根本不会失去Flash。你只会获得Flash、Flex和纯AS3。


AS2并不像在Flash中看起来那样与时间轴绑定。你可以像在AS3中一样编写AS2代码。许多AS2开发人员更喜欢在时间轴中只保留一个帧。 - Ammar
注意。我不同意你可以像编写AS3一样编写AS2。 - Joel Hooks
2
使用FlashDevelop可以编写类似AS3的相对清晰的AS2代码。在我必须回到AS2的一些项目中,由于从AS3中学到的经验教训,我的AS2代码比以前更加简洁和优雅。 - Iain
你能具体告诉我为什么“创建可重用代码更容易”吗? - Tony

0
我建议将一个10万行的AS2应用程序移植到AS3,与从头开始完全重建相比,考虑到需要花费的时间,实际上并没有太大的区别。你会发现,这100,000行代码中许多可能根本不需要。如果代码包括任何类型的框架等内容,我会更加担心,因为您可能需要自己进行移植,此时您可能不妨重新开始。您的客户需要考虑他们希望这个项目存在多长时间。如果少于几年,我建议不要费心。如果这个应用程序是他们整个业务的核心,那么我建议升级到2.0版本,并在重写AS3功能的同时花时间改进应用程序的功能和可用性。

0

AS3并不比AS2更好

我不太明白这种AS2抨击的事情...我只知道很少有人真正理解AS2的巨大可能性...AS2可以与Ruby相比,而AS3只是Java十年前的水平...是的,它很慢,但比AS3更强大和表达力强...除了适当的错误处理之外,我不知道AS3有什么基本功能AS2没有(不要混淆语言和API)...在一个相关的话题上,我最近深入研究了一些细节...AS3可以访问更大的API,但大多数重要的东西都不是你在业务应用程序中需要的。

如果你充分利用AS2,它可以非常高效和优雅...如果你想在AS3中获得与AS2相同的灵活性(或者至少是最好的近似),你会发现大部分代码执行速度都会变慢...

不要使用AS3

我很认真...如果你想针对AVM2,使用尽可能少的AS3,要么通过MXML使用Flex,要么使用Haxe...如果快速开发很重要,就使用Flex,如果更注重性能(当然还有其他原因),就使用Haxe...

直到今天,AS3一直是个死胡同...自从它推出以来,语言没有改变过一点...当然,FlashPlayer有新功能,但AS3自从3年前发布以来就一直是AS3,除了Vector,这只是一些相当虚假的东西...你可能想注意到,从AS1到AS2花了3年时间,从AS2到AS3又花了3年时间...现在真的是时候推出AS4了,但Adobe似乎没有在研究任何类似的东西...相反,他们专注于不断扩大他们的产品组合...

你应该怎么做?

从字面上看,我有这样的印象,你有大约100000行的意大利面条代码...所以实际问题是代码,而不是语言...你需要重写...如果你认为有意义,甚至可以用AS2重写(尽管我仍然建议使用Haxe)...实际上使用AS2的唯一好处是,如果你幸运的话,你可以复制和粘贴一些实现...但你真的应该从头开始构建一个干净的应用程序,使用你所使用的语言提供的最佳功能,作为OOP、AOP和FP的子集(Haxe/AVM1将允许所有这些东西),或者采用MXML允许的声明性方法...

除了明显的成本问题外,没有任何重写的缺点...优点是你会得到一个更好的代码库,更易于维护、灵活,可能甚至表现更好,或者至少使分析和后期优化更容易...

当涉及到客户时...

... 我建议您告诉他们简单的事实:他们可以拥有一个提供最低价格的固定功能集合的软件(这可能是在您的情况下他们现在拥有的),或者他们可以拥有灵活/可扩展/设计良好的软件 ... 即使他们选择后者,他们也必须接受,每隔一段时间需要采取像重写这样的激烈措施 ... 代码的持续退化是不可否认的现象 ... 当您设计软件时,您开始做出决策,在哪些方向上它可以发展,在哪些方向上它不能,您将达到一个点,在该点上,用于实现软件未设计的功能而添加的肮脏黑客技巧的晦涩网络将使进一步扩展变得不经济... 当您要扩展软件(无论是您自己的还是不是),不要犹豫指出这一点,说明进行重写是一个非常好的选择,而不是让他们支付所有需要添加所需额外功能的低效工作的费用…软件扩展的成本呈指数增长... 重写之后,这个成本回到了“接近0的浅部分”... 判断何时进行重写取决于您的专业知识(如果需要查看100K行代码才能实际进行这种评估,那么在我看来,现在是进行重写的好时机)... 先了解软件应该走向何方,需要什么,然后选择最有效的方式来做到这一点...


适当的错误处理非常重要。在AVM1中,能够猴子补丁整个API虽然不错,但代价是运行时错误?绝对不行——特别是对于商业应用程序。我已经在从Flash 5到现在的所有版本中开发了大型RIA,虽然AVM1的表现力很好,但AS3中的结构、速度和错误处理意味着我再也不会写AS2代码了。此外,AS3保持并扩展了AS最强大的特性之一——闭包。在我的书中,这比猴子补丁重要得多。 - Branden Hall

-3

如果你认为升级应用程序代码库会很困难,我会考虑调整硬件规模。调整硬件规模既快又便宜。


3
这些是客户端技术。你不能强制终端用户升级。 - cliff.meyers
那么您建议花费更多的资金重新开发现有的应用程序,而不是扩展硬件? - Kane
@Kane -- 你不能升级客户的笔记本电脑,特别是如果它是面向终端用户的应用程序,尤其是如果该应用程序不打算供企业使用... - Justin Haygood
这个问题在“性能问题”方面相当模糊。客户端是遇到了服务器端性能问题还是客户端性能问题?我假设问题出现在服务器端(例如,连接关系型数据源并处理数据)。@Justin,你假设性能问题与客户端有关,我想我们有不同的观点。 - Kane
Kane在任何时候都没有提到任何服务器端技术,因此假设性能问题是服务器端的问题就像假设他的性能问题与行星的排列有关一样不可取。 - timoxley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接