Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks

          介紹

          最近,我進(jìn)行了很多次的Adobe Flex 開(kāi)發(fā)職位的面試(作為自由職業(yè),這點(diǎn)需要澄清,如果我現(xiàn)在的老板碰巧閱讀到該文的話(huà))。幾乎每一次的面試,F(xiàn)lex框架的問(wèn)題最終都會(huì)被提出來(lái)(通常就是 Cairngorm)。我就會(huì)解釋盡管我知道這些框架的存在,但是我從沒(méi)有真正的去用它們。這個(gè)決定看起來(lái)對(duì)我來(lái)說(shuō)足夠理智,但是這些不能給面試帶來(lái)深刻 的印象。我開(kāi)始厭倦因?yàn)槲业?#8220;對(duì)Flex框架缺乏經(jīng)驗(yàn)”而失去項(xiàng)目,我展開(kāi)了一項(xiàng)任務(wù)僅我所能的去學(xué)習(xí)它們。

          非常巧,本地用戶(hù)組的下一次聚會(huì)提到了Flex框架的話(huà)題,具體提到Cairngorm, Mate以及PureMVC(你可以在這里看觀(guān)看)。我時(shí)常在Flex show播客上聽(tīng)到所有的這些框架,但是從來(lái)沒(méi)有真正的意識(shí)到他們是如何運(yùn)作的以及他們之間的不同,本文的目的就在于指出這些。


          本文提供了當(dāng)前最流行的Flex框架,你可以根據(jù)了解來(lái)選擇最適合你的團(tuán)隊(duì)或者項(xiàng)目的需求的框架。本文覆蓋了 Cairngorm、Mate、PureMVC以及Swiz 框架。我特意選擇了這些框架是因?yàn)樗鼈円呀?jīng)被Flex show 播客提及并且或者已經(jīng)被類(lèi)似360|Flex 的會(huì)議所提出。

          要求

          完成本教程, 您需要安裝以下軟件和文件: Flex Builder 3


          必備知識(shí)

          讀者需要知道什么是Adobe Flex。當(dāng)然,如果讀者對(duì)框架涉及的內(nèi)容有基礎(chǔ)的了解,對(duì)面向?qū)ο缶幊淘硪约霸O(shè)計(jì)模式的基礎(chǔ)了解的話(huà),對(duì)于閱讀本文那就更有幫助了。


          Cairngorm 框架

          Cairngorm是已知的最為古老與最好的Flex 框架。它實(shí)際上是一個(gè)微架構(gòu)——它提供了一系列已經(jīng)被證明可以很好的互相協(xié)作的設(shè)計(jì)模式的集合。Cairngorm采用累來(lái)自Java開(kāi)發(fā)世界的笨重并且 把焦點(diǎn)集中到了三個(gè)關(guān)鍵區(qū)域:處理用戶(hù)行為,包裝服務(wù)端交互與業(yè)務(wù)邏輯,并且管理客戶(hù)端狀態(tài)以及在用戶(hù)界面(UI)上體現(xiàn)客戶(hù)端狀態(tài)。

          在Cairngorm構(gòu)建一個(gè)項(xiàng)目包含了拆散你的應(yīng)用到若干個(gè)包中并且擴(kuò)展Cairngorm的類(lèi)。如下是一個(gè)Cairngorm 項(xiàng)目 主要包含的部分和類(lèi)。

          • ModelLocator —— 作為數(shù)據(jù)存貯角色的單件——反映程序的狀態(tài)。單件類(lèi)的性質(zhì)抱枕了程序中所有的組件都訪(fǎng)問(wèn)相同的數(shù)據(jù)。
          • ServeiceLocator 是另外一個(gè)單件,它作為集中存貯例如HTTPService的服務(wù)的角色存在。同樣,因?yàn)樵擃?lèi)是一個(gè)單件,所有程序中的組件都會(huì)訪(fǎng)問(wèn)相同的服務(wù)。
          • 業(yè)務(wù)邏輯被包裝到了實(shí)現(xiàn)了命令模式的Command類(lèi)中。這些類(lèi)描述了程序響應(yīng)用戶(hù)事件的邏輯。
          • 事件會(huì)被FrontController 類(lèi)處理,它會(huì)針對(duì)事件來(lái)執(zhí)行相應(yīng)的command類(lèi)。每個(gè)程序可以回應(yīng)的用戶(hù)事件都必須被注冊(cè)到它所附和的command類(lèi)。
          • Delegate 類(lèi)會(huì)被用來(lái)做遠(yuǎn)端服務(wù)訪(fǎng)問(wèn)與反饋的代理。


          優(yōu)點(diǎn)

          Cairngorm是Flex社區(qū)中眾所周知的,并且是一個(gè)Adobe 開(kāi)源網(wǎng)站上的項(xiàng)目,有良好的支持并且一個(gè)活躍的開(kāi)發(fā)者社區(qū)繼續(xù)為它工作。此外,它借用了來(lái)自Java開(kāi)發(fā)世界的已被證明的策略。最后,它非常適合團(tuán)隊(duì)開(kāi)發(fā),因?yàn)樗峁┝艘粋€(gè)高級(jí)的結(jié)構(gòu)化的一套方法來(lái)允許分發(fā)任務(wù)進(jìn)行創(chuàng)建應(yīng)用。

          缺點(diǎn)

          或許對(duì)Cairngrom做出的最多的批評(píng)就是它需要你去寫(xiě)非常多的類(lèi)。在Cairngorm中,每個(gè)事件映射到一個(gè)Command;因此,你不得 不為每個(gè)在你的應(yīng)用中可以被觸發(fā)的事件寫(xiě)一個(gè)對(duì)應(yīng)的command類(lèi)。另外,你必須要寫(xiě)其他的command必須用到的其他類(lèi),例如delegate。這 會(huì)快速的增加一個(gè)小型應(yīng)用的類(lèi)的數(shù)量到一個(gè)巨大的數(shù)字。

          第二,因?yàn)镃airngorm 實(shí)現(xiàn)了它自己的處理事件的方法,這個(gè)會(huì)把內(nèi)建的Flex 事件模型變得錯(cuò)綜復(fù)雜。它也有其他一些限制。因?yàn)槊總€(gè)事件都必須要有它自己的command類(lèi),你就被限制只能為每個(gè)事件提供一個(gè)響應(yīng)器 (responder).并且,Cairngorm事件并不會(huì)冒泡,所以如果你想要通知其他更高一級(jí)的容器,就只能自己來(lái)處理了。

          第三條普遍的批評(píng)就是框架依賴(lài)于全局單例,讓想要模塊化和單元測(cè)試變的困難。雖然你可以從數(shù)個(gè)單例中破壞這個(gè)框架模型讓這些處理簡(jiǎn)單些,但是額外的工作需求會(huì)復(fù)雜化流程。

          資源

          Mate 框架

          Mate 是一個(gè)基于標(biāo)簽的事件驅(qū)動(dòng)型框架。基于標(biāo)簽意味著它可以完全使用MXML實(shí)現(xiàn)。事件驅(qū)動(dòng)使框架的主要焦點(diǎn)放在更簡(jiǎn)單的來(lái)定義事件的回應(yīng)。

          使用Mate來(lái)創(chuàng)建項(xiàng)目只需要兩個(gè)基礎(chǔ)的必要條件: 你必須有一個(gè)或多個(gè)事件,以及你必須有一個(gè)成為“事件映射”的MXML文件——其實(shí)就是在主要的應(yīng)用程序文件中包含了一個(gè)簡(jiǎn)單的MXML文件。它定義了你 想要監(jiān)聽(tīng)的事件以及這些事件該如何被處理。你必須至少有這些文件中的一個(gè),在需要的情況下也可以使用多個(gè)事件映射。

          Mate也實(shí)現(xiàn)了依賴(lài)注入的思想 ——有時(shí),適用于好萊塢原則,即 “不要給我打電話(huà),我們會(huì)打電話(huà)給你們”.對(duì)象被這樣構(gòu)造出來(lái):需要的數(shù)據(jù)會(huì)被供給或者注入到類(lèi)中。也就是說(shuō),類(lèi)不去呼叫外部獲取數(shù)據(jù)(即“不要給我打電 話(huà)”),而是接受他們所需要的數(shù)據(jù)(即(“我們會(huì)打電話(huà)給你們”))

          優(yōu)點(diǎn)

          Mate 通過(guò)它對(duì)依賴(lài)注入的使用實(shí)現(xiàn)松耦合。因?yàn)榻M件不用依賴(lài)全局單例,對(duì)場(chǎng)景來(lái)說(shuō)他們是自由人。Mate不限制你使用Flex的內(nèi)建事件模型,也不會(huì)像 cairngorm一樣限制你每個(gè)事件都要一個(gè)單獨(dú)的響應(yīng)處理。Mate 的MXML文件以及標(biāo)簽直接并且便于使用,同時(shí)如果你卡住了,它提供了不錯(cuò)的文檔并在網(wǎng)站上有大量的代碼范例。

          缺點(diǎn)

          Mate只使用了MXML。所以,如果你是那種做每件事都喜歡使用ActionScript類(lèi)的人,那么你就必須要調(diào)整你的正常習(xí)慣。因?yàn)镸ate 不會(huì)為你的應(yīng)用定義一個(gè)結(jié)構(gòu),它留給你來(lái)定義。從此以后,你將會(huì)不得不協(xié)調(diào)自己的團(tuán)隊(duì)來(lái)確保你的所有開(kāi)發(fā)人員以一個(gè)相容的方式編碼。最后,如果你碰巧需要 和 Adobe LiveCycle Data Services ES協(xié)作,那么請(qǐng)注意,Mate一般不會(huì)處理LiveCycle Data Sevices ES 提供的數(shù)據(jù)管理。

          資源

          PureMVC 框架

          雖然Flex也可以使用PureMVC框架,但是它實(shí)際上并不是作為一個(gè)Flex框架而設(shè)計(jì)的。PureMVC的創(chuàng)建者希望PureMVC框架是與語(yǔ)言無(wú)關(guān)的。其實(shí),如果你訪(fǎng)問(wèn)他的網(wǎng)站,你會(huì)發(fā)現(xiàn)在多種語(yǔ)言上的實(shí)現(xiàn)以及代碼范例。

          PureMVC 以模型—視圖—控制器模式(MVC 模式)為中心,以把項(xiàng)目切分到模型,視圖以及控制器層為目標(biāo)。PureMVC中通過(guò)是Model,View以及Controller,這三個(gè)單件類(lèi)體現(xiàn)了 這些層——而為了幫著這些層之間通訊使用了第四個(gè)單件類(lèi)Façade ,同時(shí)他也作為中央存貯器的角色存在。

          和Cairngorm很像,創(chuàng)建一個(gè)使用PureMVC框架的項(xiàng)目,需要分割你的項(xiàng)目到若干包中,然后通過(guò)繼承框架的類(lèi)來(lái)顯現(xiàn)你的定制類(lèi)。PureMVC 還加入了作為程序主入口點(diǎn)的Façade類(lèi)。

          優(yōu)點(diǎn)

          類(lèi)似Cairngorm,PureMVC一個(gè)穩(wěn)定的框架并且擁有一個(gè)龐大的活躍社區(qū)來(lái)支持它。因?yàn)樗鼮閼?yīng)用需要如何被創(chuàng)建以及開(kāi)發(fā)人員之間的標(biāo)準(zhǔn)化編碼提供了一個(gè)意義明確的結(jié)構(gòu),所以它也非常適合團(tuán)隊(duì)開(kāi)發(fā)。

          缺點(diǎn)=

          由于對(duì)單件的依賴(lài),PureMVC 很容易就獲得與Cairngorm相同的批評(píng)。它并不是一個(gè)專(zhuān)門(mén)針對(duì)Flex的框架,所以它并不會(huì)像Cairngorm般利用MXML的特點(diǎn)。和 Cairngorm一樣,PureMVC對(duì)于事件處理?yè)碛兴约旱姆椒ǎ⑶宜鼤?huì)使標(biāo)準(zhǔn)的Flex事件模型更難運(yùn)作。PuremvC 是一個(gè)相當(dāng)復(fù)雜的框架,相對(duì)更難快速學(xué)會(huì)。除非你的團(tuán)隊(duì)非常熟悉它,培訓(xùn)新的雇員會(huì)提高生產(chǎn)時(shí)間。

          最后,還是和Cairngorm 一樣,PureMVC框架需要?jiǎng)?chuàng)建很多類(lèi),這些創(chuàng)建工作會(huì)增加生產(chǎn)時(shí)間和項(xiàng)目的大小。

          資源

          Swiz框架

          Swiz 是一個(gè)為簡(jiǎn)化事件處理與異步遠(yuǎn)端方法呼叫提供方法的控制反轉(zhuǎn)(IoC)框架。Swiz框架主要的焦點(diǎn)放在以一種簡(jiǎn)單有效的方式提供一個(gè)可靠的MVC規(guī)范。 和Cairngorm以及PureMVC所不同的是,它直接回避了宏大的Java模式并且不會(huì)強(qiáng)調(diào)任何預(yù)定義的文件夾結(jié)構(gòu)。

          使用Swiz創(chuàng)建一個(gè)項(xiàng)目需要告訴Swiz框架關(guān)于你的應(yīng)用的組件。在Swiz的核心,Swiz是一個(gè)集中的工廠(chǎng)模式。組件都會(huì)經(jīng)由一個(gè)成為BeanLoader的工具類(lèi)載入到這個(gè)工廠(chǎng)。當(dāng)應(yīng)用開(kāi)始的時(shí)候,工廠(chǎng)處理這些組件的實(shí)例化。

          與此同時(shí),Swiz 通過(guò)Autowire這個(gè)自定義Metatag來(lái)提供依賴(lài)管理。Autowire標(biāo)簽是Swiz為你處理定義類(lèi)之間依賴(lài)性的一個(gè)方法。

          優(yōu)點(diǎn)

          Swiz是使用簡(jiǎn)單并且不用為你的項(xiàng)目強(qiáng)制定義結(jié)構(gòu)。憑借它的Autowire 依賴(lài)注入系統(tǒng),和Mate一樣,既確保了組件之間的松耦合又為你管理了依賴(lài)性。同時(shí),Swiz也和Mate一樣,使用了內(nèi)建的Flex事件處理機(jī)制,這一 點(diǎn)在使用內(nèi)部單件實(shí)現(xiàn)了全局事件分發(fā)之類(lèi)的重要方面是非常有幫助的。

          缺點(diǎn)

          然后,又是和Mate一樣,Swiz并不為你的應(yīng)用的結(jié)構(gòu)定義許多,它留給你自己去做。所以,你將會(huì)不得不為你自己的團(tuán)隊(duì)協(xié)調(diào)來(lái)確保你的所有開(kāi)發(fā)人員以兼容的方式編碼。

          第二,因?yàn)樗褂昧俗远x的metatag,所以項(xiàng)目需要一些附加的設(shè)置——例如,設(shè)置一些額外的編譯參數(shù)。或者這些步驟不困難,但是其他框架不需要,而Swiz卻需要。文檔指明了Flex 2用戶(hù),所以他在flex2之后的版本將不再是一個(gè)問(wèn)題。

          資源

          做出你的選擇

          雖然還不是很徹底,但是這里提供的信息配合資源,應(yīng)該能夠?yàn)槟銓?duì)每個(gè)框架的方法,優(yōu)點(diǎn)以及缺點(diǎn)提供了一個(gè)基本的了解。你會(huì)怎么從這些框架中選擇一個(gè)超過(guò)其他框架的框架呢?

          也許第一個(gè)問(wèn)題是,我是否需要一個(gè)框架?Flex 與MXML 為快速構(gòu)建應(yīng)用提供了非常強(qiáng)健的一套方法。我一般不使用框架的原因是當(dāng)我嘗試適應(yīng)框架的一套方法的時(shí)候需要做更多的工作,相比較僅僅使用Flex框架而 已。對(duì)我來(lái)說(shuō),一個(gè)框架需是一個(gè)能夠讓任務(wù)變得更簡(jiǎn)單并且提高生產(chǎn)率的東西,而不是某些我用它只是因?yàn)槲铱梢曰蛘咭驗(yàn)槲蚁胍屪约撼蔀橐粋€(gè)更好的開(kāi)發(fā)人員 而去使用。

          就如本文開(kāi)頭寫(xiě)的,我在一個(gè)電話(huà)面試中所提到的,在給出為什么我沒(méi)有選擇使用一個(gè)框架的解釋之后,采訪(fǎng)者這樣反應(yīng),"我必須在一個(gè)巨大的團(tuán)隊(duì)中工作。當(dāng)然啦,你了解我需要多少有些了解框架的啦"。少許思考之后,我知道了他的意思。

          使用框架的好處之一就是可以標(biāo)準(zhǔn)化一些事情如何被編碼。也就是說(shuō),如果程序員A 和程序員B使用相同的框架為同一項(xiàng)目的兩個(gè)部分工作,你可以很確定他們寫(xiě)的是兼容的。所以可能你需要問(wèn)你自己的另外一個(gè)問(wèn)題就是,你想要強(qiáng)制確定多少結(jié)構(gòu)?

          框架非常大量的檢測(cè)了他們需要多少預(yù)定義的結(jié)構(gòu)。如果你是工作在一個(gè)大型團(tuán)隊(duì)中,你可能想要比做自己的項(xiàng)目更多強(qiáng)制的結(jié)構(gòu)。預(yù)定義的結(jié)構(gòu)提 供的團(tuán)隊(duì)工作環(huán)境的簡(jiǎn)化和代碼的一致性足夠彌補(bǔ)你為一個(gè)更需要結(jié)構(gòu)的框架創(chuàng)建所有必須的類(lèi)而增加生產(chǎn)時(shí)間和項(xiàng)目大小。相比之下,如果你是一個(gè)項(xiàng)目上工作的 唯一開(kāi)發(fā)人員并且你只是需要一些東西來(lái)是生活更簡(jiǎn)單速度更快的開(kāi)發(fā),然后可能就你需要一個(gè)那種不需要強(qiáng)調(diào)太多結(jié)構(gòu)的框架來(lái)運(yùn)用到你的項(xiàng)目上。

          看起來(lái), 選擇一個(gè)正確的框架或者選擇完全不使用框架, 只是開(kāi)發(fā)人員的目標(biāo)的一個(gè)功能呢個(gè)以及在哪個(gè)環(huán)境創(chuàng)建項(xiàng)目而已。我能給你的最好的建議就是誠(chéng)實(shí)的高速你自己項(xiàng)目需要什么。我知道在我做完我的研究并且寫(xiě)了 本文之后,我放開(kāi)了對(duì)于框架的觀(guān)念,我認(rèn)為它們的確實(shí)現(xiàn)了明確的需求。

          posted on 2009-07-14 11:36 seal 閱讀(551) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Flex+ActionScript
          主站蜘蛛池模板: 察雅县| 礼泉县| 湖口县| 成武县| 名山县| 巫山县| 定州市| 贵州省| 隆安县| 永泰县| 舟山市| 多伦县| 长阳| 会昌县| 渭南市| 五原县| 龙州县| 阜城县| 济南市| 洱源县| 繁峙县| 万载县| 益阳市| 万宁市| 中宁县| 保定市| 怀远县| 衡阳市| 江都市| 广宁县| 黔西县| 巴南区| 津市市| 舒城县| 布尔津县| 南木林县| 新化县| 清河县| 普宁市| 黔南| 潮州市|