從ActionScript3編程書籍中的ENTER_FRAME說起
學(xué)習(xí)一門技術(shù),比較系統(tǒng)的途徑仍然是書籍。然而教程書籍有時(shí)提供的范例并沒有推薦良好的編程習(xí)慣,使讀者走了不少的彎路。7yue這篇博文便是就ActionScript3編程書籍的一些常見情況來描述這一問題。
現(xiàn)在開始接觸ActionScript3編程的愛好者越來越多,他們可以選擇從不同的角度來學(xué)習(xí)ActionScript3編程:書籍,教程,博客,開放源碼項(xiàng)目等等。我最近發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是AS3的部分教程中都存在一個(gè)小問題,就是當(dāng)面向初學(xué)者提供某些范例和教程時(shí),這些內(nèi)容并未從良好的編程經(jīng)驗(yàn)或者是習(xí)慣入手,而是寄期望于日后的學(xué)習(xí)中,再了解更好的,更加值得使用的方法,我在想,為什么很多教程或文章不能一開始就提供***實(shí)踐相關(guān)的內(nèi)容給愛好者呢?這樣,既提高了學(xué)習(xí)的效率,也減少了學(xué)習(xí)的彎路。
比如,下列的一小段代碼出自某本O'Reilly的書籍
書中這段代碼目的是讓開發(fā)者了解AS3在SWF中的處理優(yōu)先級(jí)是大于可視化效果的,于是,就先用這樣的一段代碼來說明:
- for (var i:int = 0; i<50; i++){
- myClip.x+=2;
- }
這段代碼為了說明在循環(huán)中,MC的位置根本就不會(huì)按照for循環(huán)一樣,呈現(xiàn)x坐標(biāo)的遞加,而是直接跳轉(zhuǎn)到***循環(huán)結(jié)束時(shí)x坐標(biāo)的位置上去,這其實(shí)沒什么問題,但是下面的代碼,則是說,開發(fā)者可以使用Event.ENTER_FRAME事件來觸發(fā)一個(gè)偵聽函數(shù),在偵聽函數(shù)中處理一個(gè)MC的移動(dòng)。
- 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);
- }
- }
開發(fā)者在學(xué)習(xí)這段代碼的時(shí)候,尤其是初學(xué)者,就對(duì)Event.ENTER_FRAME有了深刻的印象,于是乎,隨著他的學(xué)習(xí)曲線,以后對(duì)于AS3中對(duì)于MC的動(dòng)態(tài)處理,他們自然而然的就會(huì)不斷的用到ENTER_FRAME,甚至于不斷的將各種處理機(jī)制都放入其中。結(jié)果顯而易見,大量的應(yīng)用性能和靈活性問題隨之而來,或許在若干長的時(shí)間過后,才聽到有講座說,ENTER_FRAME是一個(gè)不推薦的編程方式,更推薦大家用Timer云云之類的說法。
這些類似的教程內(nèi)容本身沒有什么錯(cuò),為了演示一個(gè)功能或特點(diǎn),使用了最容易實(shí)現(xiàn)的方法來說明問題,如果這是一個(gè)售前工程師的工作,那么這種方式是***的,如果是面向讀者和學(xué)習(xí)的人,這種方法是粗心的,不考慮學(xué)習(xí)成本和效率的,因?yàn)樗苯訉?dǎo)致了開發(fā)者的常用編程方式,直到開發(fā)者積累了一定的經(jīng)驗(yàn),抑或是付出了一定的代價(jià)之后,才會(huì)發(fā)現(xiàn)有更好的方式,更加的性能來實(shí)現(xiàn)同樣的結(jié)果。所以,如果寫書或者是教程,我覺的更好的一點(diǎn)是多考慮一下學(xué)習(xí)者的成本和曲線,不要為了達(dá)到目的,而讓學(xué)習(xí)者獲取了一個(gè)實(shí)際并不可取的方法。
記得以前我就發(fā)現(xiàn)過這樣的問題,在MSDN上,存在著大量的代碼和范例,結(jié)果用到后來,才發(fā)現(xiàn)是不好的和有很大代價(jià)的內(nèi)容,我就在想,為啥不能在我學(xué)習(xí)的時(shí)候就告訴我一個(gè)更好的方法呢?
【編輯推薦】