Flex2.0實(shí)踐指南
本文和大家重點(diǎn)學(xué)習(xí)一下Flex2.0實(shí)踐方面的知識(shí),F(xiàn)lex2.0.1,是目前Flex的***版本。有很多人預(yù)言,F(xiàn)lex2.0.1中很多新功能的定位,將直接面對(duì)Flash9,以及Adobe即將推出的Apollo項(xiàng)目。
Flex2.0實(shí)踐
自從識(shí)得Flex以來(lái),我便喜歡上了這個(gè)新技術(shù)。說(shuō)它是新技術(shù),也許有點(diǎn)欠妥。利用AS腳本在Flash中制作表單,這應(yīng)該是很早以前的事情了,想來(lái)很多Flash高手現(xiàn)在仍然對(duì)Flex嗤之以鼻,也算是這個(gè)道理。其實(shí)Flex之所以能夠得以流行,完全得益與Adobe給Flash帶來(lái)的革新:ActionScript3.0。
Flex來(lái)了
我以前曾經(jīng)在Flash中寫(xiě)過(guò)一些小程序,主要是為了獲得良好的視覺(jué)效果。說(shuō)實(shí)話,在所有我用過(guò)的IDE中,F(xiàn)lash的IDE的確很糟。界面很擠、幫助很少、動(dòng)態(tài)提示不友好,而且,as腳本很難管理等等。所以,我對(duì)用Flash來(lái)做稍大一點(diǎn)的項(xiàng)目,從來(lái)都沒(méi)奢望過(guò)。只到有一天,我偶然看到了Flex2。
Flex2.0.1,是目前Flex的***版本。用過(guò)的人都知道,相比于Flex2.0來(lái)說(shuō),F(xiàn)lex2.0.1的推出,是Flex功能上煥然一新的飛躍。有很多人據(jù)此預(yù)言,F(xiàn)lex2.0.1中很多新功能的定位,將直接面對(duì)Flash9,以及Adobe即將推出的Apollo項(xiàng)目。
***個(gè)Flex2.0實(shí)踐
近期的一個(gè)B/S項(xiàng)目,我完全采用Flex來(lái)進(jìn)行客戶端開(kāi)發(fā)。由于Flex提供了充足的通訊方式:HttpService、WebService以及RemoteObjectService調(diào)用。這三種方式都是異步的,并提供了回調(diào)事件,這種方式恰好是Ajax大行其道的原因。
基于項(xiàng)目的考慮,在項(xiàng)目中需要進(jìn)行大量的數(shù)據(jù)插入、查詢、報(bào)表、以及數(shù)據(jù)CRUD的操作,其實(shí),ROS應(yīng)該是***的通訊方案。不幸的是,ROS需要FlexDataService服務(wù),對(duì)于多CPU的服務(wù)器,這是個(gè)高成本的投入,只能忍痛割愛(ài)了。因此,本項(xiàng)目采用HttpSevice作為通訊方案。
你是否需要框架?
說(shuō)實(shí)話,在客戶端的開(kāi)發(fā)中,我從來(lái)沒(méi)有認(rèn)真考慮過(guò)框架問(wèn)題。因?yàn)?,?duì)于HTML和Javascript組成的Web頁(yè)面來(lái)說(shuō),的確沒(méi)有一個(gè)很理想的解決方案。可是在Flex中,問(wèn)題終于出現(xiàn)了。
總體來(lái)說(shuō),F(xiàn)lex2.0算得上一個(gè)獨(dú)立的開(kāi)發(fā)環(huán)境。這一點(diǎn),類似與Java和.net開(kāi)發(fā)環(huán)境一樣。Java提供了JDK,.net提供了.netframework,而Flex2.0則提供了FlexSDK。我們的應(yīng)用,寫(xiě)在ActionScript的類和一個(gè)個(gè)的MXML文件中。對(duì)象與對(duì)象之間,通過(guò)事件和方法調(diào)用進(jìn)行通訊,不同的對(duì)象往往需要共享相同的通訊組件和數(shù)據(jù)、甚至共享代碼和變量。因此,當(dāng)寫(xiě)了十個(gè)以上的類時(shí),你就會(huì)發(fā)現(xiàn),代碼亂的一團(tuán)糟。
聯(lián)想在Java中使用Spring的經(jīng)驗(yàn),我立即意識(shí)到框架的重要性。那幾天,我一直在Adobe官方網(wǎng)站上轉(zhuǎn)悠,試圖找到些線索。于是,我找到了Cairngorm。
Cairngorm框架
Cairngorm框架,用作者自己的話來(lái)說(shuō),只能叫做MicroArchitecture(微型架構(gòu))。的確,Cairngorm只是一些設(shè)計(jì)模式的應(yīng)用,包括FrontController模式、Commander模式、以及Proxy模式等。其原理非常的容易理解:
FrontController負(fù)責(zé)注冊(cè)所有的事件類型以及事件發(fā)生時(shí)所調(diào)用的Commander。當(dāng)組件之間需要通訊時(shí),組件向FrontController發(fā)出event并在event中傳遞參數(shù),然后FrontController調(diào)用Commander完成任務(wù)并更新model中的數(shù)據(jù)。所有的model中的DataObject都是bindable的,這樣,所有的組件自動(dòng)實(shí)現(xiàn)了數(shù)據(jù)的更新。
ModelLocator是所有modeldata的核心。系統(tǒng)用到的所有公共數(shù)據(jù)都存儲(chǔ)中ModelLocator中,Commander通過(guò)ModelLocator進(jìn)行數(shù)據(jù)通訊。通訊采用Proxy的方式,所有的通訊方式都被隱藏在Proxy的后面,這樣當(dāng)更換通訊模塊的時(shí)候,不會(huì)影響到其他的代碼。
當(dāng)然,由于Flex2.0提供的幾種Service方式差異很大,所以,Proxy技術(shù)并不能完全的實(shí)現(xiàn)代碼隱藏。但這種技術(shù)本身,給我們提供了很大的參考價(jià)值。
簡(jiǎn)化的方案
Cairngorm的確給我們帶來(lái)了全新的理念,但我只打算使用它的部分理念,因?yàn)椋瑢?duì)于一個(gè)中小型的項(xiàng)目來(lái)說(shuō),Cairngorm還是顯得復(fù)雜。Cairngorm的設(shè)計(jì)目標(biāo)是,***程度上減輕組件之間的耦合,而把所有的對(duì)象之間的通訊都改為事件。這樣,在減低了耦合性的同時(shí),降低了系統(tǒng)的性能和可測(cè)試性。
在我的設(shè)計(jì)方案中,我去掉了FrontController、Commander等概念,保留了ModelLocator、Event和Proxy。系統(tǒng)流程如下:ModelLocator負(fù)責(zé)注冊(cè)和派發(fā)事件,存儲(chǔ)中心數(shù)據(jù)。組件通訊采用Event方式,同服務(wù)器的通訊采用ServiceProxy。
所有的代碼都寫(xiě)在Action類中,所有的Action類都實(shí)現(xiàn)了IResponder接口。這樣,ServiceProxy就可以把異步事件傳播給Action對(duì)象。每個(gè)Action對(duì)象實(shí)例化一個(gè)ServiceProxy類,并在組件中調(diào)用action對(duì)象進(jìn)行操作。如果需要通信,則由組件在ModelLocator中派發(fā)事件,另一個(gè)注冊(cè)了該事件的組件獲得了通知。
這是一個(gè)簡(jiǎn)化了的設(shè)計(jì)方案,雖然增加了對(duì)象之間的耦合,但整體思路更加清晰,代碼量和編譯后的swf文件大小都得到了優(yōu)化。
FlexBuilder2心得
FlexBuilder2完全基于Eclipse平臺(tái),這給項(xiàng)目的設(shè)計(jì)帶來(lái)了極大的性能改善和增強(qiáng)的用戶體驗(yàn)。
方便的功能:
可選的自動(dòng)編譯項(xiàng)目,這樣在保存后系統(tǒng)立即更新到bin目錄,并能夠立即檢查出代碼中的錯(cuò)誤并給出提示;
可以選擇清除所有輸出,系統(tǒng)將自動(dòng)重新進(jìn)行編譯;
強(qiáng)大的調(diào)試功能;
CTRL+ALT+↑向上復(fù)制一行,CTRL+ALT+↓向下復(fù)制一行,這個(gè)功能在代碼編寫(xiě)中非常的實(shí)用;
可以改變代碼文件的文件編碼;
不足之處:
無(wú)法選擇打開(kāi)項(xiàng)目。如果一個(gè)項(xiàng)目從其他地方復(fù)制過(guò)來(lái),在FlexBuilder中在無(wú)法打開(kāi),只能新建一個(gè)項(xiàng)目,然后把這個(gè)項(xiàng)目覆蓋上去;
不能自動(dòng)在Developer視圖和Debug視圖之間進(jìn)行切換,甚至連快捷鍵都沒(méi)有提供;
編輯器不支持鼠標(biāo)拖拽復(fù)制,只能采用剪切和粘貼,相當(dāng)不便;
調(diào)試窗口中不能對(duì)變量進(jìn)行鼠標(biāo)懸停提示,也不能把變量直接拖拽到watch窗口,變量查看相當(dāng)不便;
很多自定義類的方法在動(dòng)態(tài)提醒中無(wú)法顯示參數(shù)定義;
不能對(duì)import列表進(jìn)行優(yōu)化。雖然提供了對(duì)import的整理功能,但這個(gè)功能只在類中可以使用,在mxml中則無(wú)法使用;
缺少代碼格式化功能;
對(duì)xml文件支持不好,或者說(shuō)干脆不支持;
似乎說(shuō)了很多的缺點(diǎn),但其實(shí)只是因?yàn)樘P(guān)注,所以太看重Flex2.0。Flex3.0已經(jīng)在研發(fā)的過(guò)程中,隨著Apollo項(xiàng)目的推出,F(xiàn)lex將會(huì)有一個(gè)更加值得期待的未來(lái)。
【編輯推薦】
- Flex2.0.1新特性和所做改進(jìn)概要
- 揭露Flex2.0的幾大誤區(qū)
- 技術(shù)分享 Flex2.0文件上傳如何實(shí)現(xiàn)
- FlexBuilder3.0與Eclipse3.4的***結(jié)合
- Flex ComboBox和Datagrid組件用法指導(dǎo)