Skip to main content

[pureMVC] Flex app 開發的心得分享

使用 pureMVC 開發到現在,也遇到不少網友詢問相關問題,以下是 Erin 整理的幾個使用 pureMVC framework 開發 Flex app 的心得分享:
  1. 雖然 pureMVC Standard 版本就很夠用了,但是你的 app 有未知擴充需求的話還是建議使用 Mulitcore 版本以達最大的開發彈性。

  2. 先問問自己能不能理解架構內 Notification and Command 是什麼作用?如果答案是『NO』,請先熟悉 pureMVC 的架構再行考量是不是要實作...因為有太多問題都可以利用它們解決。

  3. 先搞清楚你將要開發的 app 流程,花點時間研究官網上的 pureMVC Utilities,一定有工具包可以解決你的需求。

  4. 除了 Application 外 view component 不應該持有任何跟 pureMVC 有關的 Class instance reference,請善用 Flex & Flash Event 機制與外部溝通。

  5. 別把 view component 直接對 view component 溝通的開發邏輯帶到架構內,如果你還是打算這樣作就根本不需要使用任何 framework 來幫助開發!
    View componet 溝通邏輯應該是 A-view component -> Event -> A-Mediator -> Notification -> Proxy, Command or B-Mediator -> B-view component。Event 機制在這邊有很大的作用,Mediator "儘量"不持有 view componet 子物件只接收其 Event ,不僅可以讓你跳脫如何用 A view 控制 B view 的思維...因為 A view 根本不需要去知道它發了 Event 後誰會被控制; 對 view component 新增修改也比較容易,ex. view component 由 Flex 3 改 Flex 4 版本(尤其 Flex 4 的架構改很大...你就會發現用 Event 的重要性...)

  6. Mediator 要 override onRegister and onRemove function,做人要有始有終,請記得 EventListener 在移除前都清乾淨。

  7. 跨 view components 的資料最好都使用 proxy or command 處理,別直接 mediator 互傳。

  8. 整合 Flex 綁定資料機制:Value Object and Proxy 內使用 [Bindable] 來同步資料,可以省下處理後 update 資料的 Notification。如:


  9. public class SomeProxy extends Proxy implements IProxy
    {
    [Bindable]
    public var itemlist:ArrayCollection;
    .........
    所有的 itemlist 處理都是由 SomeProxy 執行,
    只需要在 view component 初始化的時候由其 Mediator
    將 itemlist 指定進去,view component 不作任何的
    ArrayCollection 操作,只將"操作的動作"發送 Event
    由 SomeProxy 同步,這樣同一個資料就可以讓不同
    的 view component 持有但是又不會互相干擾!

  10. 善用 runtime shared library。利用 Flex Library project 打包所需要的 asset files。再來想想你還需不需要 Module?目前 Erin 手上開發的專案使用 RSL,專案主程式僅 260kb, Flex runtime framework 564kb(不會重複載入), project assets swf 217kb....這樣還需要用 Module 嗎?所以 Module 在 Erin 的定義是久久出現一次的 view component 才會用它實作。



先寫到這邊,其他等想到再補充~~

Comments

  1. 謝謝Erin,對pureMVC的了解又多懂了些皮毛了!
    請問假設mediator要去讀取同樣已讀取的資料(比如:xml data),也是要由command or proxy來執行,而不能用mediator來互丟嗎?

    ReplyDelete
  2. 以上都是建議而已!其實程式寫作是你寫它不是它玩你...運用 framework and disign pattern 只是為了讓程式更有邏輯便於開發。
    但是如果發現你的 pureMVC app 都只有用到 Mediator 的時候,就需要重新思考一下你的架構有沒有問題囉!=)

    ReplyDelete
  3. 如果要在 runtime 載入 view component
    有沒有可以套用所有新增的 view component 的方法

    目前我是用 module
    把 swf 給 load 進來
    因為 swf 的路徑可以用字串去連
    EX : someString + ".swf"

    如果不使用 module 是否有其他方法可以達成呢?

    ReplyDelete

Post a Comment

Popular posts from this blog

[Swift3] weak 與 unowned 關鍵字

雖然在 Swift 中看起來"很像"是不需要煩惱內存管理的問題,不過實際上它還是遵循著自動引用計數 (ARC) 的規則,當一個物件沒有被其他對象引用時會自動被銷毀,如果三魂七魄沒有完全回位的話,就會有個靈體留在現世的空間裡,最經典的範例如下: 閉包(Closure)引用 classClassA { typealias Complete = ()->() var name : String var onComplete : Complete? init(_ name: String){ self.name = name print("Hello I am \(self.name)") onComplete = { print("\(self.name): onComplete!") // --> 閉包引用 self, 計數 + 1 } } deinit { print("deinit: \(self.name)") } } var a : ClassA? = ClassA("A") // --> 引用計數 + 1 a = nil // 2-1 = 1 還剩下 1 所以沒辦法銷毀 ---output------- Hello I am A 由於這邊的 onComplete 宣告為 Optional, 正確的做法要連同 onComplete 一起刪除才可以被回收,若不是 Optional 則會進入無法回收狀態: var b : ClassA? = ClassA("B") b?.onComplete = nil // --> 還好是 Optional 可以設成 nil 計數 - 1 b = nil // 計數 = 0 所以被回收 ---output------- Hello I am B deinit: B 但是做人不需要煩惱太多,這時候就出動 unowned 關鍵字讓物件可以順利被回收: onComplete = { [unowned self] in print...

[書評] 拖延心理學:為什麼我老是愛拖延?是與生俱來的壞習慣,還是身不由己?

作者: Jane B. Burka & Lenora M . Yuen 推薦指數 ★★★★★ 有時候,只是想了解事情發生原因而不是尋求解法 在這邊不是要講這本書的內容,而是想聊它對我的影響。