RIA framework – Cairngorm 2 淺析
隨者 Itereation::Two被併入 Adobe 成為 Consulting Team與 Flex 2 /AS3 的面市,Cairngorm這個framework的正統性與普及性也跟者水漲船高,最近專為 Flex 2 量身打造的新版 Cairngorm v2 也剛放出來,所以早上花了點時間再 review一次,看看有沒有什麼大改變,本文就是一早研究心得的速記。
簡單來說,Cairngorm是一個framework,提供了許多現成的 class library、運作機制與template,目地是幫助工程師更有紀律的開發中、大型專案(by saying mid to large I mean 5-10 engineers in several teams and project time ranges from months to years)。
它的架構很單純,只有六大項
-business
-commands
-control
-model
-view
-vo
Cairngorm在最上層定義了六大塊的基礎結構,然後在每個 project 再 extends 後加入自已需要的功能,這也是大部份 framework 的玩法,例如 ARP, Struts, Cake等。
以 Cairngorm 2 內附的 login 例子來說,它的事件流程是這樣的:
1. 畫面上有 帳號、密碼兩個文字框與一個 login按鈕,當user按下 button時,form會將兩個文字欄位的內容打包成一個 LoginVO(Value Object),然後將此事件廣播出去
2. 背景裏的 FrontController早先會先透過 addCommand()註冊偵聽這個事件,並且轉手將它交給 Command 處理
3. Command裏面只做兩件事,一是建立一個 delegate物件,透過它去連回server(細節請看下一步),二是建立好 responder 物件,裏面有 onResult, onFault兩個 callback handler
4. delegate 則是真正跟 server連線傳接資料之所在(講的fancy一點就是它會連回 middle tier做資料交換與同步),在這個物件裏面可以決定要用 remoting, web service, http get/post 等任何一種方式來傳遞,只要確定當結果回來時,要正確的 mapping回 responder裏面的 callback handler
5. 當 repsonder接到result後,就做後續的處理;在Cairngorm的設計裏,有一個叫做 ModelLocator 的 central storage,這個玩意基本上是個 Singleton Class,裏面放一堆程式執行期間要共用的變數與物件,以前大家都塞在 _global裏,後來 AS2時代我叫它 GlobalSettings (也有人叫它 SystemInfo),總之意義都一樣,以這個例子來說,responder就會將接到的result更新到 ModelLocator裏面。
6、最特別的一點是在 ModelLocator被更新後,由於它裏面每個 member 都被設定為 binding,因此資料一改變,就會牽動所有bind到它身上的物件,例如 view的切換或 dataProvide的更新。
至此一個事件流程就跑完了。
這裏面比較有意思的地方有幾個:
-每個tier切割的很乾淨,甚至太乾淨了(你聽過水清則無魚吧?),分工明確且單純,因此可以說是非常的 decoupling,對大型專案來說這是非常重要的。
-command 與 delegate 徹底分離,他的考量是這樣如果將來要從 Web Service 跳到 remoting甚至更炫一點的 Flex Enterprise Service時,只要換掉 delegate層就好,responder 的部份可維持不動。
-他善用 flex 2裏 event bubbling的特性,讓所有的事件都bubble到最上層的 Application後再集中做處理,只是這樣做的小麻煩就是一定要用自製的 event class去廣播才行。
簡單結論:
1、Cairngorm 是一個設計的想當不錯的framework,但實務上應用的機率實在不高,主要原因是他的優點也就是他的缺點。例如切割的太乾淨導致開發時間反而延長,對中小型的專案(五十萬以下二到三人合作)來說優點變成了負擔。
2、他有部份設計雖然乍看之下很 decoupling,但實作上卻會碰到難以避免的麻煩,例如 command 雖然設計美意是可重覆使用,但實際上每個案子的差異性卻會導致這種機率變的很低;另一個例子是 command 與 delegate分離,實務上當從 web service切換到 remoting時,如果傳回的資料結構與型態不同,勢必得將 callback handler重新寫過,所以一開始這樣的分離設計就是有問題的。
3、簡單講,想到每做一件事(例如 login)就要寫六個檔案(controller, command, delegate…)就覺得有點沒力,就算再自虐的 java工程師大概也不會想輕易嚐試,更別提如果這是在debug,光是trace到正確的檔案恐怕就得花六倍的時間。
正如古諺所云:Know the rules so you know what you are breaking.
知道有Cairngorm 這個東西還是挺不錯,至少知道那些地方可以吸收使用,那些地方可以再改良,更重要的是如果有一天真要上場處理超大型專案,至少也知道該從那裏下手使力(死道友不死貧道?)。
最後,做個小小民調:
你已經在使用 Flex 2 了嗎?(即使只是裝起來稍做把玩)
如果是,請留個言出個聲吧,真好奇在中港台三地已經有多少玩家們投入這個領域了。


34 Comments Add your own
1. RitaLee&hellip | February 22nd, 2006 at 2:06 pm
自虐的java工程師寫的東西不見得少多少,
Caringorm只有骨幹,你要把內容再填進去,
而大部份我所見過的java framework,
至少幫你把主要的內容,如controller之類的都完成了,
你寫的部份大約只有類似command之類的程式,
所以我認為Caringorm目前比較算是Pattern。
2. jeremy&hellip | February 22nd, 2006 at 2:16 pm
>自虐的java工程師寫的東西不見得少多少
呵 我的意思就是java工程師一向就習慣寫很多,但看到 Caringorm 這樣搞恐怕也受不了…
我覺得每 implement一個動作就分在六個地方寫code實在是很值得商榷的事,最近大量debug時對這件體認*特別特別*的深。
rule of thumb is:
每多一層分割,就增加一倍的debug複雜度。
但矛盾的是,通通寫在一起也不見得好,所以best practice仍然在那遙遠的前方吶…
3. saicn&hellip | February 23rd, 2006 at 9:10 am
我已经下载了flex2beta2,把玩中。
本人位置大陆。
看了jeremy对这个frameword的介绍,感觉还是不错的,之前也有见到有人介绍Cairngorm这个框架,因为时间的缘故一直没空看。
希望,有机会可以用flex2跑个把项目出来。
4. jeremy&hellip | February 23rd, 2006 at 12:06 pm
嘿 終於有一位同好出現了!
如果有什麼問題歡迎隨時來信切磋
5. saicn&hellip | February 23rd, 2006 at 4:49 pm
呵呵,主要还是学习,希望,FLASHPLAYER8.5,能早日RELEASE.
6. jeremy&hellip | February 24th, 2006 at 1:18 am
根據我的瞭解,今年六月後才有可能正式發佈,屆時 flash 8.5 應該也會出來,但時程上已比去年宣佈的晚至少一季。
7. harry&hellip | February 24th, 2006 at 9:45 am
我装了,稍微看了下as3,不过还没有认真研究过,哈哈
8. musehu&hellip | February 24th, 2006 at 3:18 pm
我的 Flex2 beta 還有66天…
但上週看 adobe forum 說他們不會讓
release 版跟 beta 之間有gap,
就像他們的 alpha 跟 beta 之間沒有 gap 一樣,
我的 alpha 是還有 20多天時, beta 版就出來了,
不知是否真的再 40 天就出來了, 也就是五月一日發佈…哈哈 真期待!!
實在太喜歡 Flex2 這個系列了,
有時想到以後的網路應用會大不同於現在的模式就睡不著睡…
Flex2 的應用層面跟潛力實在是很大!!
9. jeremy&hellip | February 24th, 2006 at 3:31 pm
嘿 現在有三位同好,可以湊一桌打麻將了…orz
是啊,flex 2的影響力絕對是空前絕後的驚人,越早上船收獲越多啊~我也是從alpha出來後就不怎麼睡覺了…
btw, 在beta1 與 release之間應該還會有一個beta2,約在三月中到四月初之間,但正式release至少是六七月後的事了。
這期間看 flexcoders 是最好的學習來源,adobe的工程師通常會很快速的回答問題。
當然,也可以隨時與我聯絡大家多切磋。
10. Foster&hellip | February 24th, 2006 at 4:40 pm
最新我也開始研究Flex2,希望jeremy兄能夠多多指導
我們這些新手啊!
11. musehu&hellip | February 25th, 2006 at 1:01 pm
對后, Beta1 -> Beta2 -> Release 這樣的軟體開發週期也才比較穩定, 有的是 alpha1->alpha2->beta1
之類的; Flex由 alpha1->beta1 時讓很多人也嚇了一跳;
如果正式版是六七月的話, 那真的可以好好的趁現在有時間多K點多實驗點東西多想點計畫了, 呵呵 ^_^.
Flash8/AS2 跟之前的版本, 有很多不能實現的想法, Flex2/AS3 都一起出籠了; 以前寫Desktop/MFC/Java/DirectX 煩都煩死人的功能/架構, Flex2/AS3 也都有辦法輕鬆如意地達成;
ERP/EIP/CMS/Game/App/Database/Chat 好多東西都可以做, 市場應用上真廣泛, 我覺得我都快變成 Flex2 的推銷員了…
12. saicn&hellip | February 25th, 2006 at 3:00 pm
看来JEREMY兄台一篇文字,勾出来好多FLEX2的同好啊,哈哈
13. jeremy&hellip | February 25th, 2006 at 9:02 pm
to musehu: 對啊,flex2 出來後ERP/EIP/CMS/Game/App/Database/Chat 通通都會有不一樣的面貌,infinite possiblilty 是最讓人興奮的事。
台灣真的想推兩兆雙星數位內容,不如拿個幾千萬重點性贊助幾家有潛力的公司,搞不好就會有像 Tata, SAP這樣的新星冒出頭了。
to saicn: 很高興能認識這麼多對 flex2 有興趣的玩家,有機會可以多交流。
14. cmanwalking&hellip | February 26th, 2006 at 9:37 am
从这个网站偶然的看到了FLEX2,之后就下载安装看看,确实不错。如果网络传输速度没有问题的话,是一个RIA的很好的解决方案。但我确实是不懂啊,只是看了看界面,因为我一直用PHP+MYSQL来做此类的东西,所以知道的FLEX2的优点所在。
就大陆而言,介绍这方面的东西很少,即使有,深度也不够,希望不久会改观。谢谢这个地方和老师呀!
对了,我是大陆的。
15. jeremy&hellip | February 26th, 2006 at 12:08 pm
歡迎來玩
目前我也是用 php/mysql/amfphp 做為 flex 2 的後台,雖然無法用內建的 remote object service但透過傳統的 NetConnection 還是可以交換資料。
只是照目前flex(與相關產品線)的發展來看,將來 Flex 與 Java 的關係會更緊密,該是時後熟悉一下 java了…
(喔,當然結合最緊密的還是 flex + coldfusion, 畢竟都是adobe自家產品也是最能全盤掌握的東西,但是對一般編程員來說實在沒必要把自已的路越走越窄,所以最終還是只剩 java這個選擇)
16. cmanwalking&hellip | February 27th, 2006 at 9:40 am
是呀。毕竟JAVA开辟了编程的新天地,发展到了今天,也不是说其它的随便模仿就可以达到这个水平的。我也正在转JAVA,不过JAVA在界面方面确实同FLEX有差距的,FLASH在界面方面是老牌么!
哈哈,我是因为寻找MYSQL的多国语言的支持搜到老师的网站的,没想到学到了其它很多东西。
虽然在大陆,但老师的网站很快呀(.tw的就不行了),我几乎每天都来看看有什么新东西。老师说要每天发关于FLEX的文章,可有点失言呀。。。
17. jeremy&hellip | February 27th, 2006 at 10:41 am
哇哈哈,終於被抓包了…
那時原本是真的充滿雄心壯志想每日一文介紹flex,但後來發現自已學都來不及了,實在無力寫東西,再加上幾星期後就立刻得用flex2開發案子,就連blog都沒時間顧了…Orz
不過現在專案跟產品都差不多完成了,日後應該比較有時間多寫點東西了。
18. saicn&hellip | February 27th, 2006 at 3:50 pm
JEREMY,已经开始筹备FLEX2的案子了?这么快?
不等STABLE ,直接BETA2上么?
19. james&hellip | February 27th, 2006 at 4:47 pm
你好 拜讀你的文章若收穫不少,趁現在失業。學學RIA也不錯!!
20. jeremy&hellip | February 27th, 2006 at 6:25 pm
to saicn: 實際上第一個案子跟產品都已經開發完並上線了,因為我們做的是intranet 的app,可以完全控制內部電腦的flash player 版本,所以去年十月就決定直接用最新的技術進行不然等過半年還是得痛苦的再porting一次,事後証明這個決策是正確的。
但對一般 consumer website 我們就保守許多,還是死守 flash 8 不放。
to james, 歡迎來玩,有問題請隨時提出,順帶一提,恆逸資訊有ria相關課程,從 AS2 語法入門、中階ria整合實作到高階ria專案開發都有,如果有空可以晃去聽聽說明會。
21. saicn&hellip | February 28th, 2006 at 9:12 am
to jeremy:在可以完全控制FLASHPLAYER的场景使用最新的技术直接上的话,过后如果有程序更新的话,不是会非常麻烦吗?如果使用的是非STABLE的产品的话.
望JEREMY解我的疑惑.
22. jeremy&hellip | February 28th, 2006 at 3:30 pm
更新的問題主要可分為兩個層面:
1、builder的更新:當builder/compiler 更新時,舊的source code往往需要更改後才能在新的vm上執行(這點從 alpha -> beta1 時經歷過一次,但更變幅度非常小,約略只花20分鐘就全部改好通過編譯)
2、player 的更新:這是比較麻煩的地方,從alpha 到 beta 之間 flash player內部使用的 bytecode format 都經歷大幅度的改變,因此造成client端確實得每次都重新安裝player。
我們的解決方式為:
1、儘量用 stand alone exe 的方式散佈新版本,把程式(main.swf)跟 flashPlayer.exe bundle 在一起置於企業內部伺服器,讓user同時下載
2、撰寫 player detection 然後導向到內部的flash player安裝頁面,儘量讓客戶無痛的升級到最新版 flash player 8.5。
雖然這些過程有點繁瑣,但考量到 AS3/flex2帶來的效率與開發速度跟日後維護的簡便性,現在忍受一些小麻煩卻可以確保寫出來的東西在未來可延續使用,而不用再從 AS2 移植到 AS3,這樣比較起來一點點小麻煩就不算什麼了。
經過跟客戶溝通他們也能接受這樣的考量,一切就上路了。
23. cmanwalking&hellip | March 3rd, 2006 at 3:47 pm
哈,什么时候老师能一个简单SAMPLE来讲解一下完整的FLEX2的具体用法和妙处。或者给个展示也行。。。
24. jeremy&hellip | March 3rd, 2006 at 6:57 pm
最近正在整理一些 flex2 的學習資源與sample code, 這裏先提供幾個:
http://tinyurl.com/zxxs2
另外裝好 flex 2後在
Flex Builder 2 Beta 1\Flex Framework 2\samples
裏面就有四個非常好的範例,例如 flexstore v2 與 dashboard 的 source code,雖然它們不見得是 best practice 的展現,但仍然可以學到許多flex2裏開發常用的手法。
25. zywang&hellip | April 27th, 2006 at 1:55 pm
我们基于Cairngorm作的几个项目差不多可以投入商业应用了。Cairngorm还是不错的东西,刚学起来比较晕,我们有时候也不是完全按照他的本意来用。比如它用controller来dispatch event,我们就比较偷懒了。
26. jeremy&hellip | April 27th, 2006 at 4:28 pm
呵,改過再用才聰明,如果你們的作品是公開的話,麻煩請給我網址去觀摩觀摩
27. Dreamer&hellip | May 11th, 2006 at 5:24 pm
真高兴发现了这么一个好地方。。呵呵
我接触FLEX的时间不长,不到一年,主要用Flex1.5+JAVA做过一个小东西,还是被老师逼着干的,整天看E文。。。而且FB是内存杀手……:(
玩Flex3.0 BETA 2的时候有点受不了,错误太多,帮助文档都有错,实在玩不下去,现在就等正式版出来。(PS:BETA 3 听说又改进不少……期待stable)~~
欢迎到我家玩~呵呵
28. jeremy&hellip | May 11th, 2006 at 9:58 pm
hi Dreamer, 歡迎來玩,flex2 beta3 已經相當穩定了,可以放心玩玩囉。
29. Dreamer&hellip | May 15th, 2006 at 4:57 pm
找了半天只发现你家有关于Cairngorm的详细介绍~~
我以前没用过这个东东~~Google也搜不到详细的中文资料,看来得自己动手翻译了~~~
以后得多向你请教~~~(加入收藏夹^_^)
30. jeremy&hellip | May 15th, 2006 at 5:10 pm
歡迎多交流呀
31. zdus&hellip | October 31st, 2006 at 3:38 pm
We are using Flex 2.0 and Cairngorm,
32. jeremy&hellip | November 2nd, 2006 at 4:27 pm
cool, 有沒有公開的作品可看?
33. Why use Flex? at enchao.c&hellip | November 7th, 2007 at 11:57 am
[...] RIA framework – Cairngorm 2 淺析 [...]
34. mosluce&hellip | September 16th, 2009 at 2:21 pm
在下玩的是Flex3
看樣子在下應該不適用Cairngorm…
Framework 有個令在下比較注重的是”快速開發”的性質
Trackback this post | Subscribe to the comments via RSS Feed