7yue's Weblog

Thinking in RIA Solutions...2470,8514,1020的生活演绎

« UPS也推出其AIR客户端用Adobe AIR打造的亦歌跨平台桌面播放器 »

一个普遍存在的问题

现在开始接触ActionScript3编程的爱好者越来越多,他们可以选择从不同的角度来学习AS3,书籍,教程,博客,开放源码项目等等。我最近发现一个有趣的现象,就是AS3的部分教程中都存在一个小问题,就是当面向初学者提供某些范例和教程时,这些内容并未从良好的编程经验或者是习惯入手,而是寄期望于日后的学习中,再了解更好的,更加值得使用的方法,我在想,为什么很多教程或文章不能一开始就提供最佳实践相关的内容给爱好者呢?这样,既提高了学习的效率,也减少了学习的弯路。

比如,下列的一小段代码出自某本O'Reilly的书籍
书中这段代码目的是让开发者了解AS3在SWF中的处理优先级是大于可视化效果的,于是,就先用这样的一段代码来说明:

for (var i:int = 0; i<50; i++){
  myClip.x+=2;
}

这段代码为了说明在循环中,MC的位置根本就不会按照for循环一样,呈现x坐标的递加,而是直接跳转到最后循环结束时x坐标的位置上去,这其实没什么问题,但是下面的代码,则是说,开发者可以使用Event.ENTER_FRAME事件来触发一个侦听函数,在侦听函数中处理一个MC的移动。

myClip.addEventListener(Event.ENTER_FRAME,slideClip);
function slideClip(evt:Event):void{
  if (myClip.x <100){
    myClip.x += 2;
  } else {
    myClip.removeEventListener(Event.ENTER_FRAME,slideClip);
  }
}

开发者在学习这段代码的时候,尤其是初学者,就对Event.ENTER_FRAME有了深刻的印象,于是乎,随着他的学习曲线,以后对于AS3中对于MC的动态处理,他们自然而然的就会不断的用到ENTER_FRAME,甚至于不断的将各种处理机制都放入其中。结果显而易见,大量的应用性能和灵活性问题随之而来,或许在若干长的时间过后,才听到有讲座说,ENTER_FRAME是一个不推荐的编程方式,更推荐大家用Timer云云之类的说法。
这些类似的教程内容本身没有什么错,为了演示一个功能或特点,使用了最容易实现的方法来说明问题,如果这是一个售前工程师的工作,那么这种方式是完美的,如果是面向读者和学习的人,这种方法是粗心的,不考虑学习成本和效率的,因为它直接导致了开发者的常用编程方式,直到开发者积累了一定的经验,抑或是付出了一定的代价之后,才会发现有更好的方式,更加的性能来实现同样的结果。所以,如果写书或者是教程,我觉的更好的一点是多考虑一下学习者的成本和曲线,不要为了达到目的,而让学习者获取了一个实际并不可取的方法。

记得以前我就发现过这样的问题,在MSDN上,存在着大量的代码和范例,结果用到后来,才发现是不好的和有很大代价的内容,我就在想,为啥不能在我学习的时候就告诉我一个更好的方法呢?

  • quote 2.狼灰灰
  • 有些书籍只能作为启蒙作用,google一下就知道一切了。计算机领域的书很容易过时的,尤其是像flash这种更新很快的东西。
  • 2009-9-24 11:39:35 回复该留言
  • quote 3.acorn
  • 呵呵,7yue说的这个问题我自己以前也印象深刻,只是我从来没想过谁应该出来呼吁一下,或者说呼吁是否有意义.

    我觉得这个信息提供给学习者的意义还是很大的,"寄期望于日后的学习中,再了解更好的"这样的想法不仅普遍存在,甚至我觉得就算我去做这么一件事情,我也会存在这样的疑虑,就是当对方连Event.ENTER_FRAME还没有深刻理解的时候,就把Event.ENTER_FRAME和Timer同时拿出来,也许会导致人们对Event.ENTER_FRAME的理解不够深刻,对其特性没有切身体会,在你介绍Event.ENTER_FRAME的时候就直接跟人说"其实还有一个东西比Event.ENTER_FRAME更好灵活的...",这样学习者可能就会直接忽略掉Event.ENTER_FRAME,日后再回过头来发现,Event.ENTER_FRAME原来还是有他适合的场合的,只是当初书本上没有专门例举而已,因此这样又是另外一个方向的学习曲线了.

    我个人体会是曲线本身不可怕甚至有加强印象的作用. 只是7yue上面提到的例子,如果我来口头介绍,一定会专门提到不同做法之间的区别,但是写书的人可能本来是打算在后面章节再介绍Timer的。
    Admin7yue 于 2009-9-24 12:59:00 回复
    是的,任何API都有适用的场合,我期望很多开发书籍包括AS3的都能更加纵深的考虑,而不是单单从为了实现某个特性的方面出发构造范例。

    由 Admin7yue 于 2009-9-24 12:59:37 最后编辑
  • 2009-9-24 11:46:00 回复该留言
  • quote 5.bluebird
  • 想问下7月,怎么样才能提高AS3编写效率呢,我编写了一个小的射击游戏后发现玩起来有点粘的感觉,是不是对象多了以后对内存的读取就慢呢,是不是应该建一个对象池呢?还是FLASH本身效率就不高呢?
  • 2009-9-24 12:11:27 回复该留言
  • quote 6.Admin7yue
  • http://www.7yue.com
  • Flash技术要看做什么,才能判断是否是一个合适的选择,很多类型的游戏用Flash和AS3来开发还是不错的,性能的提高除了不断实践,积累,学习之外,没有什么好方法了。我这篇文章是为了给计划写AS3书籍的朋友提建议。
  • 2009-9-24 13:10:15 回复该留言
  • quote 7.jinni
  • http://swfever.com
  • 我个人的看法是,一般的书籍想要达到这种要求,很难。为什么呢?大部分书籍都是入门和高级话题并举的。在入门阶段,很多时候确实需要用最简单的案例和最直接的表述让读者明白最基本的用法。毕竟Sample就是Sample,很多时候Sample不能代表Best practice。如果我们在一个简单的范例中考虑或引入太多的因素,可能会容易让初学者感到艰涩难懂。比如我们讲到ENTER_FRAME,如果我们真的把纵深度考虑完整了,为了不让初学者滥用,我们可能还要涉及frame的生命周期,性能调优等等。而这些显然应该是高级议题才会涉及的内容。
    其实就像你所说的,很多问题是学习了一段时间以后方有领悟,而学习、感悟的这个过程直接跳过并用简单的结论取而代之的话,初学者真的能领悟和接受吗?:p
    Admin7yue 于 2009-9-28 11:14:27 回复
    同意。
    我认为好的方法,是作者可以在最后说,我们其实还有更好更酷的方法能够解决同样的问题,请参考xxx章或xxx页的某某内容。有这么一句话,就上下关联起来了。可惜,至今没有看到有多少这样组织内容的书籍。
  • 2009-9-24 15:25:41 回复该留言
  • quote 9.aa
  • 虽然觉得发这里有点不合适,但我实在忍不住了...请见谅..


    我有两个类:
    class B:
    public class B
    {
    public var b1:int;
    public var b2:String;
    }
    class A:
    public class A
    {
    public var a1:int;
    public var t:B;
    }

    现在用remoteObject从后台返回一个里面有多个A的Arraycollection,即e.result=({A1},{A2},...).
    我现在
    var ac:arrayCollection=new arrayCollection();
    ac =e.result as arrayCollection;
    trace(ac.getItemAt(0).a1);//能得出正确的值。
    trace(ac.getItemAt(0).t);//显示为null。

    请问这是怎么回事??为什么不能得出ac.getItemAt(0).t的值?

    报的错:TypeError: Error #1034: 强制转换类型失败:无法将 Object@85346a1 转换为 classes.B。

    谢谢了。
  • 2009-10-7 21:39:41 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 91204

Copyright 2007 www.7yue.com. Some Rights Reserved.
京ICP备05064035号