給所有ActionScript初學者的建議

來源:互聯網
上載者:User
初學

    聲明:這篇文章我將以連載的形式,不週期性更新,有興趣的朋友可以隨時關注。
    本文允許隨意轉載,但請註明:作者:jinni,出處:經典論壇

  在論壇當斑竹時間長了,經常會碰到有朋友提出這樣的問題:我是菜鳥,請問高手,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的標誌,就等於看到了品質的保證。(我所說的僅僅是針對英文原版而言,對於有條件的讀者來說,應該儘可能閱讀英文原版。英語不好也沒關係,看看www.blueidea.com/bbs/archivecontent.asp?id=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新特性執行個體教程”。地址:www.blueidea.com/bbs/newsdetail.asp?id=1177438&posts=current 而接下來的第三章:Flash基礎,則是重中之重了。它從最基本的文法講起,先後涉及了資料類型,變數,函數等方面,在學習這些基礎知識的時候需要注意,要理解,不要記憶。如果當你遇到某些問題,需要靠回憶來找到解決問題的辦法,則說明你沒有能夠真正的理解這個問題。如何加深理解?惟有多加練習,不要嫌它們過於簡單,簡單的背後可能蘊含著複雜的理念,即便是一個等號,也值得寫上幾十行程式來驗證它在不同情況下所起的作用。總之,既然是基礎,對任何人來說都是一樣的,它不是那種需要發揮人類想象力和創造力的上層建築。因此,實踐+總結是學習基礎知識的唯一途徑。當你對AS基礎有了一個較為完整的掌握後,就可以向更進階的領域進發了。

  五、幾點你應該知道的

  學習基礎也是有竅門的,對於大部分概念來說,都相對符合人的思維邏輯,因此你可以輕易的理解它們,也不容易發生混淆;但對於初入編程世界的朋友們來說,仍有一些是規則是陌生的,甚至是難以理解的。這時候,你所要做的就是學習並接受它們,如果你不顧這些規則而隨意在這個世界中馳騁,我想編譯器一定會給你好看。

    以下是我所總結的在學習編程基礎知識的時候你所應該注意的要點,有掛一漏萬之嫌,但至少頗具代表性。看看你是否已經熟練的掌握了它們:

  1、標識符規則:

  這裡的規則不僅僅指那些由編譯器老大管轄的條條框框:不能以數字開頭,可以包含數字、字母、底線、貨幣符號......等等。同樣也包含一些“民間”的約定,例如變數、函數命名以小寫字母開頭,類命名以大寫字母開頭,常量命名均使用大寫字母等等.....你不遵守這些約定,編譯器不會對你亮紅燈,但會造成你的程式可讀性下降。這樣我想起《thinking in java》的譯著作者侯捷先生,就是因為忽視了大陸讀者的閱讀習慣,自創了一些生澀的詞彙,結果被很多讀者以此為借口拋擲雞蛋(當然我明白更主要的原因是大多數讀者嫌這本書實在太貴了: )。

  2.=與==

  如果你正在讀小學一年級,你可以告訴我“=”與“==”的區別就是一個等號和兩個等號的區別,但作為一個程式員,你應該理解它們從根本上不是一類事物,“=”是賦值運算子,而“==”是比較子。所以不要再問我if(a=b) a=1;這樣的代碼為什麼不對。但我承認,在剛開始接觸程式的時候(c語言),我也犯過不少次這樣的錯誤,而且很長時間找不到問題所在,等到發現了錯誤,又總是自責自己為什麼會如此愚蠢。我現在特別提醒你注意這一點,如果仍然犯下這樣的錯誤,那隻能說明你比我更加愚蠢。:)

  3.運算子優先順序

  一個經常被人忽視的問題!的確,它可以通過另一種方式來完全避免優先順序帶來的困擾,那就是頻繁的使用“()”,通過“()”來決定你每一步的運算順序。只要你不怕麻煩,你完全可以這麼做,而且也增加了程式的可讀性。但不是所有的人都喜歡這樣,一個老資格的程式員通常願意在一大長串運算式中使用數個優先順序各不相同的運算子且不包含任何的小括弧,這種情況就是對你對運算子優先順序的掌握的一個考驗了。但不管怎麼說,使用“()”來明確你的運算順序並不是一件壞事,甚至值得推薦。

  4.i++與++i

  我在前面的文章中就已經提到這個問題,儘管現在看起來簡單無比,但當時的確給我們帶來了一些困擾,這個問題也是非常普遍的。充分理解它的方法就是寫幾個包含i++和++i的運算式,然後觀察運算式的運算結果及i的值。很快,這對於你來說將不再是個問題。

  5.資料類型轉換

  你可能不經常用到資料類型轉換,但你至少該知道它們的原理,那些轉換是隱式的,而那些轉換必須顯式地進行,而且有可能造成資料的損壞。瞭解了這些,可以讓你避免一些奇怪的錯誤。因為通常由資料類型轉換所帶來的程式問題很難被覺察到。

  6.數組

  嚴格的說,數組不是一種資料類型,而是一種資料結構。這是一個值得你認真研究的概念。因為在實際應用中,數組的使用率大大超過其他集合類型甚至是某些原始類型。你需要瞭解構造和初始化數組的各種有效格式,同時也應該對二位元組有所瞭解。數組與迴圈控制的配合可能已經可以一個完整的程式中一半的工作。

  六、初學者應該學習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為核心)巧妙的、隱式的實現了。我知道很多人看到這裡會暈,別擔心,我將陸續在我的連載中給大家一個滿意的解釋。

  七、提問的智慧

  前面討論了那麼多技術性的問題,你看得累了,我也寫的煩了,學習本身不僅僅是學習某項技能,更要掌握一種技巧,這次我們就來淺談一下提問的技巧。其實,我現在來寫這樣的話題未免有畫蛇添足之嫌,因為早有一篇非常優秀的文章深入地探討了這一問題,而我這一節的標題更是原封不動照抄而來,建議所有喜歡在論壇尋求協助的人都仔細的閱讀一下這篇文章:www.blueidea.com/bbs/newsdetail.asp?id=449319&posts=current 也許你看到我這篇文章已經覺得有些拖遝冗長,不想再痛苦一次,沒關係,我可以幫你把文章中的重點總結出來,同時結合中國國情和Flash論壇的特點,現在就check一下自己是否能夠做到這些要求:

  1.什麼時候才要提問:

  首先嘗試一切辦法自己解決問題:google,文檔,論壇精華貼,置頂貼,最重要的:自己的大腦。當以上工具都無法協助你解決問題時,再去提問,這樣別人才不會覺得你是個懶漢,只喜歡提出一些不過大腦的愚蠢問題。

  2.準確的描述你的問題:

  “為什麼My Code不起作用?”“為什麼這個效果出不來?”這樣的問題通常難以得到滿意的回答,因為別人根本不知道你在問什麼。

  3.善用標題:

  作為一個版主,我不可能每次來到論壇都有時間仔細的瀏覽每一個文章,所以,對於這樣的標題:“求助!”“高手進來看一下”....我可能就會“優先”忽略,我沒有那麼大的好奇心非要去一探究竟,但對於“為什麼可以用[]來引用對象?”這類相對錶述較為清楚的標題,我通常會儘可能給與同樣清楚地解釋。

  4.尊重他人:

  記住:你在論壇獲得的一切協助都是無償的,這裡沒有人欠你什麼,你沒有資格要求別人為你做任何事。所以,請不要有任何催促的情緒,例如我昨天剛剛看到的一個標題:“這次真的非常急!我連晚飯還沒有吃呢!”,我的第一反應就是:“你吃沒吃晚飯跟我有什麼關係?”,用一些與問題本身毫不相關的事情來修飾你的話題,無非是在催促高手們儘快幫你解答。你認為多寫上三個“急!”會讓你的問題得到更快的解答?事實正相反,你可能在減少你獲得答案的機會。剛才說的是情緒問題,而後一種態度問題就更不可以理喻:“有人能幫我做一個XXX嗎,做好發到我的郵箱”,通常對於這樣的問題,我會直接刪除,如果你是老闆,請讓你的屬下去做,畢竟你是要開工資給他的。

  5.關於道謝:

  時至今日,每當我在國內外的論壇上甚至是QQ群裡獲得任何形式的協助,我都不會忘記說一聲“謝謝”。這是最基本的禮貌,儘管中國的“謝謝”不象英語國家使用“thanks”那樣普遍(在許多英語國家中,thanks是家庭常用語,例如母親給兒子遞過一本書,兒子會說“Thanks,Mom”,但似乎在中國的家庭內很少聽到,似乎這一切都是理所當然的),可是無論如何,你在論壇裡獲得的協助也應該值得你說出“謝謝”這兩個字。在解決問題後及時地道謝可以幫你樹立一個良好的形象,也有助於你下次更好的獲得協助。

  6.自尊:

  前面談了尊重別人的問題,也許你自認為已經做到了,但你是否注意了相對應的另一個問題:你是否做到了自尊?每個人都希望被尊重,但如果你無法做到自己尊重自己,那也就不可能有別人來尊重你。近年來,國內論壇上出現了一系列讓我厭惡之極的求助方式,即“跪求”“跪謝”“裸求”等等。對於中國人來說,下跪是一種極其有失身份的行為,是一種屈服、懦弱的表現,也許你說我小題大作,但看著滿屏的“跪求”“冰天雪地裸體求”之類的標題,我真的不禁在想:問個問題而已,用的著這麼下賤嗎?我在國外的論壇上從來沒有看到過“Kneeling for help!”這樣的標題,甚至“Help!!”這樣的標題已經惹人反感了(見前面我推薦的那篇文章),為什麼國人就那麼“放得開”?我個人的原則是:遇到這樣的人,無論他提出什麼樣的問題,我都不予理睬。想學技術?先學做人吧。
    我知道今天這一節的內容可能引起爭議,在文中我也沒有任何的保留,非常直接的反映了我個人對一些事物的看法,只希望每一個閱讀此文的人明白,我的目的,只是希望大家可以更好的從論壇上獲得協助,That's all



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。