對AS語言的一些理解

以下是我學習Flash一週以來對AS代碼的一些理解,編碼擊規範的一些看法和對MVC框架的理解,學習過程中的一些筆記,很多地方都只是個人之見

第一部分:對AS的理解:

關於語法:

由於AS3是基於ECMAScript,語法上看起來跟Javascript很像,而OOP部分基本上是跟JAVA一致的。所以語法上學習起來比較簡單。大概的說:

1.變量聲明,函數聲明像javascript

2.事件處理提供了DOM3的事件模型,跟其它的WPFHTML5canvas也是基本一致的。

3.另外覺得比較有意思的是和javascript ,java,c#的一樣也提供了遍歷集合的語句foreach in... for in....但語法各不相同。

(事件流模型)

AS3在變量類型最大的特點是類型定義很簡單,基本類型只有Boolean,int,uint,Number,String,另外Object類型是所有對象的基類,在AS3中,一切皆是對象。對於JAVA,一些值類型是直接存儲值,而AS3中,值類型也是存儲引用,這點跟C#更像,所以AS3是一種更純粹的面嚮對象語言。但是要注意的是值類型是一種不變對象,每次修改都會導致新變量的產生和舊變量的銷燬,這樣的優點在於減小引用消耗和支持重複引用,但修改的消耗變大。值類型包括Boolean,int,uint,Number,String

另一個很明顯的特點是AS3支持的字符串,集合操作非常豐富。主要涉及到String類,Array類。像插入的三種方法:push unshift splice 刪除的三種方法:pop shift splice(1,2) ;排序的三種方式:默認,排序方(array常量),排序函數;查詢的幾種方法:concat,join,slice,tostring等 

數組的使用,覺得有幾點需要注意

1.各方法的返回值,有些返回被作用元素的索引,有些返回一個被作用元素的數組,有些返回被作用元素的個數

2.注意delete方法是把元素的位置設爲undefined,所以數組的長度不會變。

3.在用於哈希數組時多用Dictionary類,少用Object.(ObjectKey類型只能是字符串,而DictionaryKey類型可是是對象 ),當要刪除某條紀錄時,把相應的鍵設爲NULL,就能被能垃圾回收。

4.掌握用ByteArray對象來進行集合深複製的方法。可以寫一個叫clone的函數:

function clone(source:Object):*

{

     var myBA:ByteArray=new ByteArray();

     myBA.writeObject(source);

     myBA.position=0;

     return(myBA.readObject());

}

關於類型轉換:我們知道,類型轉換可以是隱式的,也可以是顯式的。在顯式轉換中,AS3沒有像C#一樣定義很多轉換工具類(Parse類,Convert類)和JAVA把轉換函數定義到類型對象的方法中,如(Integer.parseint,直接使用強制的轉換方法,當強制轉換不成功時設置默認值,而不是拋出異常。另外還可以用Number() 來轉換看上去像浮點數的字符串。

參數傳遞也跟JAVA類似,可以設置默認值,傳遞數組參數用“...”關鍵字。

總的來說,AS3的在類型和類型轉換的處理上都比JAVA,C#更加簡潔。

關於運行機制:

AS3代碼要先編譯成ABC文件(字節碼),放到二進制容器SWF文件中被Flash Player運行。

AS的垃圾回收機制:AS3的垃圾回收有兩種方式,一是通過引用計數器,對所有引用數爲0的對象進行回收。二是標記+清理模式,從對象樹的根節點開始遍歷並作標記,沒有被標記的對象會被回收。後者的開銷更大,但可以用來解決循環引用的問題。而弱引用就是當你爲某個對象創建一個引用時,該引用不會影響引用計數器的值,因此即使你不對該引用置空,對象仍然可以被回收(只要該對象身上沒有任何強引用)。在AS3中有兩個地方可以使用弱引用機制,一是添加監聽器時,二是使用Dictionary對象。如下面的代碼:

btn.addEventListener(MouseEvent.CLICK, btnClick, false, 0, true;

最後一個參數表示是否採用弱引用,默認爲false.採用強引用能防止被垃圾回收機制回收。實際上,提高性能最好的方法是當資源不需要時,用removeEventListener刪除所以加上display object上的監聽器,再手動的刪除掉之前加上去的所有display object

刪除變量:不再需要變量時,請刪除變量或將變量設置爲 null。這樣做可以標記數據,以便進行垃圾回收。刪除變量有助於在運行期間優化內存使用情況,因爲從 SWF 文件中刪除了不需要的資源。刪除變量比將變量設置爲 null 更好。


理解flash play圖的底層:

渲染機制 :理解Flash Player的渲染和代碼執行機制也是十分重要的。當你執行了改變界面的指令時,Flash Player並不是立刻把你要的內容顯示在屏幕上,它根據一定的週期來刷新屏幕,而代碼的執行則是另一回事。這和Java正相反,Java總是等待程序主動告訴它什麼時候重繪屏幕。

使用工具:另外,可以使用flash player debug版來觀察頁面重繪的情況,一般重繪越頻繁,面積越大,性能就越差。打開顯示重繪區域的功能,很容易看出當前重繪的情況。有的時候有些性能問題是覺察不出的,如被設成visible卻不斷重繪的DisplayObject,這時就需要藉助調試工具來查看了。

關於OOPOOP是一個需要長期學習的過程,我覺得最好的方法是看設計模式,從設計模式的例子上來學習OOP

1.as3語言中,函數也可以以一種變量的方式存在,所以在類中聲明實例方法也可以使用var 方法名:Fuction=function(參數){} 的方式。這樣靈活的方式有利於在運行時動態的替換方法的函數體。

2.as3中沒有枚舉類型,我們可以利用靜態屬性來模擬枚舉類型,靜態屬性和靜態方法在高級的OOP設計中經常用到,比如像工廠模式,單例模式,可以利用這個特徵來編碼項目中的工具類,管理一些靜態常量等。

3.包外類,有點類似於JAVA的內部類,只不過放置的位置不同,但要實現的東西是一樣的,都是給主類調用。注意包外類是對外不可見的,因爲每個as

文件編譯成一個單元,而每一個單元對外只有一個類。

4.gettersetter方法。這很符合C#的語言風格,可以封裝於無形,更符合客觀思維。實際上,getter,setter方法可以關聯多個屬性,也可以一個屬性都不關聯,是一種非常靈活的對外訪問接口。

另外像接口,抽象類,繼承,重寫這些概念基本上與JAVA一致。

關於核心類:

AS3開發中,有幾個方面是經常用到的,如日期和時間處理,正則表達式,XML處理,顯示編程,文本位圖視頻音頻,網絡通信,這些都是一門開發語言必備的功能。

日期和時間處理:Date類提供日期處理,Timer類提供計時器功能

正則表達式:與之相關的有String類的四個函數 match replace split searchRegExp類的test,exec方法。AS語言的正則表達也一些自身的特色,可以在匹配字符串的後面添加一些標識字符,像指示是否忽略大小寫等。

核心顯示類:區分sprite類與MoveClip

Sprite — Sprite 對象可以包含它自己的圖形,還可以包含子顯示對象。(Sprite 類用於擴展 DisplayObjectContainer 類) MovieClip — MovieClip 對象是在 Flash 創作工具中創建的 ActionScript 形式的影片剪輯元件。實際上,MovieClip 與 Sprite 對象類似,不同的是它還有一個時間軸。

第二部分:編碼規範

AS3編碼規範和JAVA基本是一致的。參照了於AS3的編碼規範官方的文檔:

http://blog.dclick.com.br/wp-content/uploads/adobe-flex-coding-guidelines-v12-english.pdf

提幾點小意見:

1.除非聲音的變量在循環中,不然局部變量應該在所屬塊中聲明。

2.註釋:對於公有調用部分,採用原文檔裏的方法,如果是非公用的,可以只是普通註釋“//”,提高效率。

3.排版:在註釋前一行應爲空行

4.命名:Boolean變量最好以can ,is,has等作爲前綴來命名。     

6.保留字:

第三部分:關於MVC框架

關於MVCMVC框架的始祖是Struts,現在在Web項目開發中應用非常廣,它的優點就不多說了。

問題一:AS3是否需要MVCAS開發模式有下面幾個特點

1.AS3是單一語言環境,多層代碼混在一起問題沒那麼嚴重。

2.AS3正常情況都是一次性編譯全部代碼,即使用了MVC框架還是需要一起編譯。單獨編譯一個模塊減少編譯時間有別的辦法,不需要依賴MVC

3.AS3本身的事件和動態特性和一些框架的功能重複。

4.AS3目前的框架還很不成熟。

由於一個項目通常不是一個完成的,在多人合作的情況下,只是單一個使用MVC框架,會使得其它項目成員的學習成本增加,協作不方便,造成不必要的麻煩,畢竟現在的AS3 MVC框架還沒得到廣泛認同和使用,所以我覺得應該使用純粹的AS語句來編寫項目。

實際上,MVC也只是一個軟件架構的方法而已,並不一定需要一個第三方的框架來支持。框架的靈魂在於三層架構的模型圖。像JAVAstruts.xwork,到後來的Stuts2Web框架,都只是架好了這個模型,並在各層之間提供一個明確統一的通道來進行通信,彷彿就是一個對象在三層之間的流動。MVC框架的的控制部分大都使用xml配置文件來實現,如struts2struts.xmlasp.net mvcweb.config。可很有利於團隊開發,例如一個struts2Web項目,架構師可以在項目設計階段寫好控制部分,通過struts.xml文件配置來對於各個ACTION請求的模型,以及對於各個請求的返回結果的跳轉的視圖,這樣整個開發過程會極其的規範,以後也好維護。

實際上MVC應該是一種思想,而不是一定要和框架掛鉤,將模型和視圖的代碼分開,並提出控制器的代碼,然後互相調用各自方法就是一個簡單的MVC架構。

如下簡單例子:

var myData:String="lincoln";

var textFiled: TextField=new TextField();

public function MVCSample()

{

textFiled.addEventListener(MouseEvent.CLICK,clickHandler,false,0,false);

addChild(textFiled);

}

public function clickHandler(event:MouseEvent):void

{

show();

}

public function show():void 

{

this.textFiled.text=myData;

}


如果要改寫成MVC模式,則類的設計大概如下:

public class M

{

public static var myData:String="lincoln";

}

public class V extends Sprite

{

var textFiled: TextField=new TextField();

public function V():void

{

this.textFiled.addEventListener(MouseEvent.CLICK,C.clickHandler);

}

public static function show():void

{

this.textFiled.text=M.myData;

}

}

public class C

{

public  static  function clickHandler(event:MouseEvent):void

{

V.show();

}

}


Model的全部引用放在固定的位置,View的引用使用靜態屬性儲存或者用管理類管理,Controler可以作爲函數或者類直接初始化並執行,亦可以通過反射。這並不需要專門的工具類來輔助,附加成本也比較小,自然就可以適用於任何規模的項目。

在衆多的AS3 MVC框架中,pureMVCCairngorm是兩個較早出現的框架,已經有點過時。看網上比較推薦的是Robotlegs框架,擁有了控制反轉和依賴注入,包裝了大部分功能,配置代碼大大減少。還有一款簡潔,輕量級的MVC框架,WeeMVC我測試官網的兩個例子,感覺三層分得很清楚,用起來很方便。不過都只是簡單瞭解,以後要用到再學。

AS3的學習現在還比較淺,很多重要的概念還沒完全搞清楚,像異常處理,命名空間,Flash Player的安全機制等,沒寫進來,AS代碼量也比較少,下週再繼續努力。

參考文獻:

Adobe官網教程:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3_Flex/WS5b3ccc516d4fbf351e63e3d118a9b90204-7eee.html 

ActionSciprt3 API文檔http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package-summary.html 

Flash.ActionScript3.殿堂之路》




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章