声明:这篇文章我将以连载的形式,不定期的更新,有兴趣的朋友可以随时关注。
本文允许随意转载,但请注明:作者:jinni,出处:经典论坛
(04.26.2004)
在论坛当斑竹时间长了,经常会碰到有朋友提出这样的问题:我是菜鸟,请问高手,AS到底该怎么学?我自认算不上高手,但三年的AS编程经验,多少也可以算半个老手(应了蓝色那句话:没有菜鸟和高手之分,只有新手和老手之别),之所以这么说,就是为了先表明立场,在网上混了这些时间,国内的AS顶尖高手我大都还算认识,自知尚无资格与他们比肩,之所以恬不知耻撰此一文,实在是不忍看着众多初学者因为摸不着学习的门路而苦苦摸索抑或干脆放弃,文中所述均为笔者个人愚见,有欠妥之处欢迎探讨。另外,非常感谢AOL,他提供了文章中用到的一些很重要的信息。
一、什么是AcionScript?
随手翻开一本技术类书籍,第一章第一节多半以“What's xxxx”做标题,要学习学一样技术,当然最先要弄清它是什么。用最简单的一句话定义:AS是一种脚本语言。这句话里有两个关键词:一、语言:所有的计算机语言都是相通的(包括汇编语言、中级语言、高级语言),这意味着如果你曾经系统的学习过其他的某种计算机语言,那么AS入门将变得非常容易。二、脚本:这说明AS是一种解释型语言(或称为脚本语言)。它具备了解释型语言的优点:快速开发,动态性,学习门槛低等等,同时它也继承了相应的缺点:最主要的两个缺点是效率低下和源代码外露。这也是让当今Flash开发者极为头痛的两个问题,效率低下,意味着Flash无法有效的完成一些复杂的算法(就拿递归来说,Flash中仅允许256层深度的递归)。而源代码外露,则让Flash作者的版权无法得到有效的保护,国内外很多著名的反编译软件都可以让Flash中的程序代码无处遁形。尽管如此,毕竟瑕不掩瑜,Flash AS仍然是一种简单易用,功能强大的脚本语言,高超的AS编程技巧+良好的美工+优秀的创意可以打造出许许多多令人瞠目结舌的作品:绚丽的特效,趣味性极强的的游戏,功能强大的网络应用程序....然而,这一切都是要从最基础到如变量、函数开始(当然,如果你有编程基础那就另当别论),在宏伟的大厦也是一砖一瓦建设起来的,不是吗?
二、解释型?编译型?跨平台?
可能有朋友注意到,刚才谈到Flash的源代码外露的问题时,有这样一句话“很多著名的反编译软件....”,即曰“解释”,又何以“反编译”?并非是我出尔反尔,Flash AS的的确确是通过解释执行的,而用来解释+执行的工具,就是大名鼎鼎、拥有98%浏览器占有率的Flash Player。然而,在你把源程序放心交给Flash Player去执行之前,必须要经过一个“编译”的过程,它将源代码转换成一种可以被FP识别的标签(tag)。而这些标签被以ZIP方式压缩存储在.swf格式的文件中。当然,一个.swf文件中除了包含AS,还有图形、声音等资源。在“解释”之前先进行“编译”并非是多此一举,编译的好处主要有三个:一、经过编译后的源代码,以标签(称为“目标代码”)的形式存在,更容易被Flash Player识别,因而可以提高解释速度。二、编译过程可以预先检测程序中的语法错误,并给出适当的错误信息,方便调试。三、编译过程也是代码压缩的过程,编译后的代码更加精简。
这么说来,把AS称为一种纯粹的解释型语言就有失妥当了,我们可以把它归类为一种“混合型”语言。混合型语言的特点是,源代码先经过编译,生成一种“中间代码”,在由相应的平台(Flash Player)去解释执行中间代码。混合型语言中的佼佼者当属现在同样火热的Java语言:Java语言的源代码(.java)经过编译,得到字节码(.class),在由平台(JVM)去解释执行字节码。不幸的是,混合型语言的这种这种“编译”过程通常是可逆的,无论是java还是flash,都可以根据其中间代码,反编译得到源代码。而且,反编译swf的难度要远远低于class,而在编译过程中加密要复杂的多,这也就是为什么如今flash反编译软件横行的原因。
Flash Player的另一个优势是提供了跨平台性,无论何种平台,只要拥有内嵌Flash Player的浏览器或是独立的Flash Player播放器,就可以欣赏Flash,而swf文件本身不需要任何的改变,不同的只是Flash Player在各个平台的实现方式而已。这一点也是它能够广泛应用于互联网的原因之一。可能有的朋友想到Flash的另一种播放方式,即Projector方式,通常我们所见到的是一个.exe文件。然而需要注意的是,以Projector方式发布的Flash,是不具备跨平台能力的。只要明白了Projector的原理,就可以很容易理解这一点,其实Projector仅仅是简单的将一个独立的Flash Player播放器和swf文件整合,前面提到,不同平台的Flash Player实现不同,因此,被整合到Projector中的swf无法使用不同的Flash Player播放,自然也就失去了其跨平台性。Projector真正的好处在于,可以让原本没有Flash Player的机器,在不安装FP的情况下,浏览Flash。其效果大致相当于你去买DVD光碟,但是你没有DVD机,因此卖光碟的小贩免费送了你一台DVD机一样。当然,现实中不可能有这样的好事。
三、学习AS需要不需要有编程基础?如果需要,该去学习那种语言?
这是一个经常听到的问题。我前面曾经提到,如果你有着其他语言的编程基础,学习AS将变成一件非常容易的事。但如果没有呢?是不是会很困难?答案是否定的。总的来说,AS是一种相对比较简单的语言,甚至你可以用它来作为你进入编程世界的第一步。如果你有着c/java/js的编程经验,你将会发现AS只是你曾经学习并掌握的知识的一个子集,你面对的仅仅是不同的API,仅此而已。然而,如果你的目的只是为了学习AS,那你完全没有必要为了它先去学习其他任何一种语言,这就像你为了弄明白1+1=2,而费尽九牛二虎之力去研究2+2=4一样,本末倒置。你现在所要做的,就是从最基础开始。何谓基础?变量、数据类型、运算符等等都算是基础,学了一段时间编程却仍然搞不清楚i++与++i的区别的人不在少数。不要小看它们,对基础概念掌握的不牢固,可能会为你将来的编程经历造成重大的困扰,正所谓千里之堤,溃于蚁穴。在这个时候,你可能需要一本书来帮助你,笔者极力推荐下面这本书:
看到他的封面,你就知道这本书是由鼎鼎大名的O'reilly公司出版。如今,O'reilly公司的出版物俨然已成为计算机技术图书的标准,看到了O'reilly的标志,就等于看到了质量的保证。(我所说的仅仅是针对英文原版而言,对于有条件的读者来说,应该尽可能阅读英文原版。英语不好也没关系,看看 http://bbs.blueidea.com/viewthread.php?tid=799443)
这本书可以说是Flash ActionScript的绝佳入门书籍,书中系统地阐述了AS中所有的基础内容,包括:变量,数据与数据类型,原始数据类型,运算符,语句,条件语句,循环控制语句,函数,事件与事件处理,数组,对象与类等等。
先不要被这一大堆内容吓倒,聪明的你应该很容易理解它们,学习的目的在于运用。因此,对你来说最重要的是按照书中的例子重新做一遍,以加深理解,最好能够修改那些例子,并对出现的错误加以分析。这样,你将会发现自己的进步速度之快甚至超过了自己的想象,尽管你现在还不能做出什么像摸象样的东西,但是,这将为你今后的成就奠定坚实的基础。有的朋友总是不重视这样的基础训练,认为创意、思想最为重要,诚然,我不否认创意在我们工作中的重要性,但好的创意,也是需要基础来实现的,否则,你充其量只能做个空想家罢了。
四、免费的就是最好的
下午文章刚一发表,就收到Flash Coders群里的朋友们的意见,认为我所推荐的书籍《ActionScript权威指南》对于初学者来说,难度有些大了。的确,也许这本书并不完全适合于没有任何编程基础的初学者,我所以推荐这本书的主要原因是,它的讲解足够系统化,按部就班,而且充分利用代码把很多容易混淆的概念分析的比较透彻,令人印象深刻。就像《Thinking in Java》,我从不认为这本书适合于Java初学者阅读(时至今日,尽管我自认为已经不算是Java初学者,但书中的很多内容我仍然没有能完全消化掉),但每当有人问我有哪些优秀的Java书籍时,我总是第一个想到它。所以,我们或许可以把《ActionScript权威指南》当作一本复习手册,当你对AS有了一个整体的印象之后,再捧起这本书,你也许会发现许多以往学习中的漏洞,或是一直盘绕在你心头的疑惑骤然解开。然而,究竟由谁来给你这个“整体的印象”?更为浅显的书籍?入门培训课程?在这里我要说的是“免费的就是最好的”,虽然这句话不适用于每一个角落,但在这里,Flash随带软件附赠的帮助系统绝对可以胜任入门师傅这个角色。很多人小看了软件的帮助系统,认为它们只不过是教你如何安装,如何卸载,这真是一个天大的误会,尤其当你使用的是某种语言的IDE时,这个误会就更加夸张了。仅仅以Flash的帮助系统来说,已经可以称得上是一本Bible。初学者可以从中解决几乎所有的问题。“帮助”的英文是Help,“救命”的英文也是Help,所以,如果你有在论坛发帖喊“救命”的时间,不如去抓住身边这额棵救命稻草。更何况,论坛的帖子可能三天也没有人回复,而帮助系统则是随叫随到。
接下来的问题是,如何更好的使用帮助?按照笔者的意见,一个完善帮助系统主要有两个职能:一、入门指导。二、工具书。Flash的帮助系统很好的完成了这些工作。以Flash MX 2004的帮助系统为例,整个系统分成五个部分:Getting started with Flash,Using Flash,ActionScript Reference Guide,ActionScript Dictionary,Using Components,前两部分基本上与ActionScript无关,这里不与考虑。后三部分中,第三和第五部分便是最好的入门指导,第四部分则是一部完整的AS字典,可以随时查阅。对于Flash初学者来说,可以先忽略掉组件(Components)的部分,下面让我们来看看ActionScript Reference Guide:第一章讲了一些废话,第二章也不是为初学者设计,它概述了Flash MX到2004在AS方面的变化,有兴趣的朋友可以看一下我的“2004新特性实例教程”。地址: http://bbs.blueidea.com/viewthread.php?tid=1177438 而接下来的第三章:Flash基础,则是重中之重了。它从最基本的语法讲起,先后涉及了数据类型,变量,函数等方面,在学习这些基础知识的时候需要注意,要理解,不要记忆。如果当你遇到某些问题,需要靠回忆来找到解决问题的办法,则说明你没有能够真正的理解这个问题。如何加深理解?惟有多加练习,不要嫌它们过于简单,简单的背后可能蕴含着复杂的理念,即便是一个等号,也值得写上几十行程序来验证它在不同情况下所起的作用。总之,既然是基础,对任何人来说都是一样的,它不是那种需要发挥人类想象力和创造力的上层建筑。因此,实践+总结是学习基础知识的唯一途径。当你对AS基础有了一个较为完整的掌握后,就可以向更高级的领域进发了。
(04.27.2004)
五、几点你应该知道的
学习基础也是有窍门的,对于大部分概念来说,都相对符合人的思维逻辑,因此你可以轻易的理解它们,也不容易发生混淆;但对于初入编程世界的朋友们来说,仍有一些是规则是陌生的,甚至是难以理解的。这时候,你所要做的就是学习并接受它们,如果你不顾这些规则而随意在这个世界中驰骋,我想编译器一定会给你好看。
以下是我所总结的在学习编程基础知识的时候你所应该注意的要点,有挂一漏万之嫌,但至少颇具代表性。看看你是否已经熟练的掌握了它们:
1、标识符规则:
这里的规则不仅仅指那些由编译器老大管辖的条条框框:不能以数字开头,可以包含数字、字母、下划线、美元符号......等等。同样也包含一些“民间”的约定,例如变量、函数命名以小写字母开头,类命名以大写字母开头,常量命名均使用大写字母等等.....你不遵守这些约定,编译器不会对你亮红灯,但会造成你的程序可读性下降。这样我想起《thinking in java》的译著作者侯捷先生,就是因为忽视了大陆读者的阅读习惯,自创了一些生涩的词汇,结果被很多读者以此为借口抛掷鸡蛋(当然我明白更主要的原因是大多数读者嫌这本书实在太贵了:))。
2.=与==
如果你正在读小学一年级,你可以告诉我“=”与“==”的区别就是一个等号和两个等号的区别,但作为一个程序员,你应该理解它们从根本上不是一类事物,“=”是赋值运算符,而“==”是比较运算符。所以不要再问我if(a=b) a=1;这样的代码为什么不对。但我承认,在刚开始接触程序的时候(c语言),我也犯过不少次这样的错误,而且很长时间找不到问题所在,等到发现了错误,又总是自责自己为什么会如此愚蠢。我现在特别提醒你注意这一点,如果仍然犯下这样的错误,那只能说明你比我更加愚蠢。:)
3.运算符优先级
一个经常被人忽视的问题!的确,它可以通过另一种方式来完全避免优先级带来的困扰,那就是频繁的使用“()”,通过“()”来决定你每一步的运算顺序。只要你不怕麻烦,你完全可以这么做,而且也增加了程序的可读性。但不是所有的人都喜欢这样,一个老资格的程序员通常愿意在一大长串表达式中使用数个优先级各不相同的运算符且不包含任何的小括号,这种情况就是对你对运算符优先级的掌握的一个考验了。但不管怎么说,使用“()”来明确你的运算顺序并不是一件坏事,甚至值得推荐。
4.i++与++i
我在前面的文章中就已经提到这个问题,尽管现在看起来简单无比,但当时的确给我们带来了一些困扰,这个问题也是非常普遍的。充分理解它的方法就是写几个包含i++和++i的表达式,然后观察表达式的运算结果及i的值。很快,这对于你来说将不再是个问题。
5.数据类型转换
你可能不经常用到数据类型转换,但你至少该知道它们的原理,那些转换是隐式的,而那些转换必须显式地进行,而且有可能造成数据的损坏。了解了这些,可以让你避免一些奇怪的错误。因为通常由数据类型转换所带来的程序问题很难被觉察到。
6.数组
严格的说,数组不是一种数据类型,而是一种数据结构。这是一个值得你认真研究的概念。因为在实际应用中,数组的使用率大大超过其他集合类型甚至是某些原始类型。你需要了解构造和初始化数组的各种有效的格式,同时也应该对二位数组有所了解。数组与循环控制的配合可能已经可以一个完整的程序中一半的工作。
(04.28.2004)
六、初学者应该学习AS1.0还是AS2.0?
这个问题同样人气很旺,频繁的出现在论坛的角落里,然后就会有“一群”(原谅我使用这个词)终年未见发过一贴的潜水员们浮上岸来指手画脚一番,然后又匆匆前入水底,我不知道是否只有这种颇具争议性的话题才能请他们“高抬贵手”,表达出他们各自的伟大构想,但是,在谈论这个话题之前,确实让我觉得的很为难,因为要想把的立场表达清楚,我不得不提及很多对于初学者来说可能为所未闻的术语,例如原型、继承、接口等等。我的目的只是想阐述AS1.0和AS2.0的区别,以便推出自己对这个问题的结论。最后,我还是决定无视那些术语的存在,直接给出结论,如果你不能够信服,请你在实践中去验证好了。:)我的结论是:AS2.0与AS1.0从本质上完全相同,但AS2.0比AS1.0更加的严格,更加的合理,更加像一种真正的面向对象语言。然而,如果你打算直接学习AS2.0,那么你不得不在面对一堆陌生的API的同时,还要去理解你可能从未接触过的面向对象编程理念。这对一些初学者可能是灾难性的,因为他们可能被太多的未知因素所吓倒。因此,我的建议是:以AS2.0的语法规范去学习AS1.0,它意味着:你应该先忽视AS2.0中与自定义类、接口有关的一切,只关注Flash提供的API,但同时你需要遵守AS2.0所引入的新的语法规范,包括强类型、大小写敏感等等。这样做的好处有两个:一、初学者不会同时面对API与设计理念的困扰,二、习惯了AS2.0的语法规范为今后由AS1.0向AS2.0转型打好基础。(很多人问到为什么在Flash MX中执行的好好的程序到了Flash MX 2004中出了问题?这就是你没有注意到AS2.0的语法规范起了变化)。
可能有的朋友会问,既然AS1.0与AS2.0本质上是相同的,那么为什么我们在学习AS1.0前不用可以的去学习面向对象思想呢?这是因为:AS1.0的设计思想中,包含了面向对象和面向过程两个分支,这两个分支是“交叉”的。而在大多数AS1.0的程序设计中,我们相对重视它的面向过程的那个分支,而面向对象的分支则被Flash本身的机制(以MovieClip为核心)巧妙的、隐式的实现了。我知道很多人看到这里会晕,别担心,我将陆续在我的连载中给大家一个满意的解释。
(05.02.2004)
七、提问的智慧
前面讨论了那么多技术性的问题,你看得累了,我也写的烦了,学习本身不仅仅是学习某项技能,更要掌握一种技巧,这次我们就来浅谈一下提问的技巧。其实,我现在来写这样的话题未免有画蛇添足之嫌,因为早有一篇非常优秀的文章深入地探讨了这一问题,而我这一节的标题更是原封不动照抄而来,建议所有喜欢在论坛寻求帮助的人都仔细的阅读一下这篇文章: http://bbs.blueidea.com/viewthread.php?tid=449319 也许你看到我这篇文章已经觉得有些拖沓冗长,不想再痛苦一次,没关系,我可以帮你把文章中的重点总结出来,同时结合中国国情和Flash论坛的特点,现在就check一下自己是否能够做到这些要求:
1.什么时候才要提问:首先尝试一切办法自己解决问题:google,文档,论坛精华贴,置顶贴,最重要的:自己的大脑。当以上工具都无法帮助你解决问题时,再去提问,这样别人才不会觉得你是个懒汉,只喜欢提出一些不过大脑的愚蠢问题。
2.准确的描述你的问题:“为什么我的代码不起作用?”“为什么这个效果出不来?”这样的问题通常难以得到满意的回答,因为别人根本不知道你在问什么。
3.善用标题:作为一个版主,我不可能每次来到论坛都有时间仔细的浏览每一个帖子,所以,对于这样的标题:“求助!”“高手进来看一下”....我可能就会“优先”忽略,我没有那么大的好奇心非要去一探究竟,但对于“为什么可以用[]来引用对象?”这类相对表述较为清楚的标题,我通常会尽可能给与同样清楚地解释。
4.尊重他人:记住:你在论坛获得的一切帮助都是无偿的,这里没有人欠你什么,你没有资格要求别人为你做任何事。所以,请不要有任何催促的情绪,例如我昨天刚刚看到的一个标题:“这次真的非常急!我连晚饭还没有吃呢!”,我的第一反应就是:“你吃没吃晚饭跟我有什么关系?”,用一些与问题本身毫不相关的事情来修饰你的话题,无非是在催促高手们尽快帮你解答。你认为多写上三个“急!”会让你的问题得到更快的解答?事实正相反,你可能在减少你获得答案的机会。刚才说的是情绪问题,而后一种态度问题就更不可以理喻:“有人能帮我做一个XXX吗,做好发到我的邮箱”,通常对于这样的问题,我会直接删除,如果你是老板,请让你的属下去做,毕竟你是要开工资给他的。
5.关于道谢:时至今日,每当我在国内外的论坛上甚至是QQ群里获得任何形式的帮助,我都不会忘记说一声“谢谢”。这是最基本的礼貌,尽管中国的“谢谢”不象英语国家使用“thanks”那样普遍(在许多英语国家中,thanks是家庭常用语,例如母亲给儿子递过一本书,儿子会说“Thanks,Mom”,但似乎在中国的家庭内很少听到,似乎这一切都是理所当然的),可是无论如何,你在论坛里获得的帮助也应该值得你说出“谢谢”这两个字。在解决问题后及时地道谢可以帮你树立一个良好的形象,也有助于你下次更好的获得帮助。
6.自尊:前面谈了尊重别人的问题,也许你自认为已经做到了,但你是否注意了相对应的另一个问题:你是否做到了自尊?每个人都希望被尊重,但如果你无法做到自己尊重自己,那也就不可能有别人来尊重你。近年来,国内论坛上出现了一系列让我厌恶之极的求助方式,即“跪求”“跪谢”“裸求”等等。对于中国人来说,下跪是一种极其有失身份的行为,是一种屈服、懦弱的表现,也许你说我小题大作,但看着满屏的“跪求”“冰天雪地裸体求”之类的标题,我真的不禁在想:问个问题而已,用的着这么下贱吗?我在国外的论坛上从来没有看到过“Kneeling for help!”这样的标题,甚至“Help!!”这样的标题已经惹人反感了(见前面我推荐的那篇文章),为什么国人就那么“放得开”?我个人的原则是:遇到这样的人,无论他提出什么样的问题,我都不予理睬。想学技术?先学做人吧。
我知道今天这一节的内容可能引起争议,在文中我也没有任何的保留,非常直接的反映了我个人对一些事物的看法,只希望每一个阅读此文的人明白,我的目的,只是希望大家可以更好的从论坛上获得帮助,That's all.
(待续)