actionscript coding時常犯的三項錯誤

In actionscript   July 17, 2005 - 9:13 am

幾年來的教課經驗與訓練新進工程師,下面三項是actionscript coding時最常見的錯誤,每一項看來都不很嚴重,但一旦犯了,往往就是幾個小時甚至幾天的 debug,整個專案進度也就….

◆scope 作用範圍的錯誤

as裏有許多時後程式的作用範圍會因為執行情況而改變,最常見的情形是 event handler,例如 btn.onPress = function(){….} 這樣的句字,就會讓作用範圍從原本的scope跳到 btn身上,此時用 this 得到的結果就不太一樣。

另外如果用 V2 UI 組件,例如 List.addEventListener(…)時,作用範圍也會改變,這點在寫 AS2 class影響更大(因為在MVC架構中,必需很清楚的定義每個 parts的範圍,才能正確的溝通與交換資料,因此一旦作用範圍改變,往往就會造成溝通失效,整個程式也就跑不下去了),解決方法是善用 flash 7.2裏新增的 Delegate class來妥善處理作用範圍(btw, Delegate class真的是妙用無窮,基本上我寫的每個form裏面都一定會預設import 加強版的Delegate)

其它常見的作用範圍改變還包括了 XML物件,如果使用native XML object時,由於作用範圍會被鎖定在 XML 上,往往會發生無法回頭呼叫 calling object的情況,此時也是作用範圍在搞鬼,可以用自訂參數或 var x:ClassPath的方式來反向指回,解決scope的問題。

總之在as編程裏,scope問題百百種,下次當你的程式明明寫的很合邏輯但總是是跑到一半就掛掉時,可以先檢查一遍所有可能改變 scope的地方。

◆執行序問題

大部份as編程員都是設計師出身,也很習慣寫 procedural 式的程式,也就是程式一行行的依序執行。

但在 as2裏面,許多時後會同時執行許多程式片段,這往往會造成某些物件還在initialization階段就被錯誤的存取,造成變數宣告不正確,或anonymous function失效,連帶導致後續的所有功能錯誤。

最簡單的例子就是使用 PopUpManager時,當 window還沒完全在畫面上畫完自已並完成啟始動作時,我們是不能去操弄它的,因此window元件提供了一個 onComplete event來解決這個問題。

同樣的例子在其它地方也很常見, rule of thumb is: 每次你有用到 load, get, create, attach之類的指令時,就要考慮是否會有執行序的問題,另外如果有用 web service, remoting, xml socket之類的功能更是要非常小心的處理callback與時間差(不過 remoting v2 已經提供非常好的 PendingCall class 來處理時間差,因此犯錯的機率不大,但使用 PC 時則要小心前面提的 scope問題)

◆清垃圾之必要

flash player的 garbage collection做的不是很好(咳,其實是挺糟糕的,但 v8 裏有很大的改進,大家可以去下載public beta 試試即知),因此coders 的自覺就很重要。

例如每個變數都應該用 var 宣告開頭,這樣至少在最後階段的 GC動作時會被 flash player清掉,同時也可用到 compiler register 加速程式執行。

而所有自已建立的variable, object, instance都應該要有destruct的動作,簡單的原則是:每次你用到 attachMovie, loadMovie, loadMovieNum, createChildren, createTextField, createEmptyMovieClip時,就要有心理準備將來用完時要自行清掉它們,例如用:

instance.removeMovieClip();
textfield.removeTextField();
delete my_var;

同時,如果你習慣使用 getNextHighestDepth()這個指令來取得可用的level,也要非常小心,它會在一個獨立的level space中建立新的level供使用,但這往往會造成日後移除時的困難(打開DepthsManager.as看一下它的實作手法就會瞭解)

總之清垃圾是非常重要的例行工作,每個自已建立的東西都要養成良好習慣順手清掉,這樣不但減少記憶體使用,同時程式執行的穩定度也會提升。

上面提的這三個問題幾乎是每年屢見不鮮,但有趣的是即使是老手也會不自覺的犯下其中幾項,而菜鳥編程員就更不知道浪費了多少寶貴青春在辛苦的 debug這些事情上面,下次你的程式出問題時,可以先從這三項下手檢查。

最後,善用 flash 裏的 debugger 工具也很重要,設定幾個 stop points就可以一目瞭然程式執行階段的記憶體配置情況,往往許多錯誤只要瞄一眼裏面的列表就可發現,這比用 trace一行行的列出來快多了;如果行有餘力,還可以用 flex 裏面的 profiler測試一下程式的執行效率(你不用為了這個功能買flex, 下載一份developer版就可以,或是請朋友裝好後將 profiler.war這支java程式給你,再丟到 tomcat下就可執行),它可以清楚的列出每一行as code的執行時間長短,因此你可以很快知道程式中那些段落寫的不好或是還有改進空間,這樣多做幾欠 refactoring,不但程式碼會更乾淨,同時執行效能也會大大的提升。

總之as2 的編程就跟寫其它程式一樣,需要很嚴謹的態度跟完整的知識,還有許多的 best practices to follow,缺一不可啊~

by admin

留言回應

hidden

您的留言會先經過站長認証後才刊登在網站上。
your comments will be approved by Administrator before appearing on the page.

Trackback this post  |  Subscribe to the comments via RSS Feed

mobile phone