actionscript > 裏所有文章列表

本日速記 - Singleton vs. Static 的優劣

In actionscript, flash, flex   April 10, 2006 - 11:04 am

原文

這真是一篇有趣的文章,關於何時該用 singleton 與 static 的問題我也已經想很久。

早期我習慣用 Static class 做為中央儲存地(dump site ?),例如把utility methods, prop, constant 都塞在裏面,這樣方便存取。

但在 flex 2 早期的幾個版本裏,static class無法透過 binding 整合到 view去,再加上 Cairngorm 2 出來後 ModelLocator 一律採用 singleton設計,那時究其原因也是為了解決 static prop/method 無法 binding 的問題。

正當我們想全面轉換成 singleton時,flex 2 beta 2 出來了,adobe 很勤快的解決了 static prop binding issue,所以之前的老方法又可以繼續使用。

這下子就陷入兩難,需要在兩者間做點選擇:到底該繼續用 static class就好?或是follow Cairngorm 的 singleton ? 當然後來我們已經有了答案,但先來看看這篇文章講了什麼。

這篇文章的基本要意就是: singleton 的彈性比較大,在可能的情況下應該儘量用 singleton而非 static.

主要的 rationale 如下:

1、singleton 的彈性來自於它可兼俱 Factory 的性質,例如 getInstance()也可視為一個 factory method 動態的產生物件(甚至是傳回一個 Abstract Factory),然後透過『多型』就可以輕鬆的置換許多 method 的功能,彈性與威力無窮。

2、singleton class 可以 extends 與 implement 其它class,但 static class 不行。

3、singleton 是 statefull,如果需要維持 state,用 singleton會比較方便。

另外,文章中也說明了選擇時的判斷條件:

1、如果是靜態不會改變的東西,例如 String utility (parse, sprintf…) 就很適合放在 static class裏,而此時它的用途就跟以前的 _global 沒太大差別,這也是colin moock 在 EAS2 中建議的方法。

2、如果是未來可能會改變的東西,放 singleton class會比較好,因為統一透過 getInstance()取得 reference後的操作行為都是一樣的,因此將來business logic 要改只要在 getInstance()動手腳傳回相容的介面即可。

這兩點也是我們後來選擇 singleton 時主要的依據,用到現在覺得還挺方便,沒有什麼大問題。

comments(2) | by admin

crash course - AS3

In actionscript, flash   March 11, 2006 - 11:19 am

- 使用 Flex Builder 建立 AS3 project

- 使用 FB2 開發、編譯與除錯程式

- AS3的全新 Class架構 與 繼承順序 簡介

- AS3新增 - Package 簡介

- AS3新增 - flash.display 與 flash.geom

- AS3新增 - DisplayList

- AS3應用範例 - 使用 DisplayList 建立文字框與顯示於畫面

- AS3新增 - Sprite (MovieClip is not the only choice anymore)

- AS3新增關鍵字 internal, public, protected 以及 private keyword的消失

- AS3應用範例 - 如何建立 Singleton class (在沒有 private class 的情況下)

- AS3新增關鍵字 override, const

- AS3應用範例 - 如何 繼承 並 override 一個 class

- AS3全新的 Event 架構(多個 Event Class, Event Bubbling, Event Stages, Event Scope)

- AS3應用範例 - 如何讓自製 class 擁有廣播事件能力?

- AS3應用範例 - 如何客製化 Event Class (subclassing Event)

- AS3新增 - 方便好用的 E4X !

- AS3新增 - Timer, setTimeout class

- 如何載入外部檔案(圖片、動畫與文字)

- AS3新增資料型態: int, uint, - , void

- undefined 與 null 的改變與使用注意事項

- AS3新增 - drawing 管理介面 - graphics API

- AS3新增 - fucntion可接多重參數 …args 的應用

- AS3新增 - Regular Expressions

- AS3新增 - Object Proxy 的萬用功能介紹 (__resolve__)

- AS3應用範例 - 如何使用 Loader 載入外部檔案並偵聽訊息

- try, catch, throw, finally 的使用

- Flash Player sandbox security 注意事項(stand alone 程式與 web app)

時間: 台北部份將分別在五、六、七月各一場 (新竹、高雄規畫中)
地點: 台北、新竹、高雄 恆逸資訊教室
費用: 未定(請洽恆逸資訊)
crash course - AS3 (2006 六月九日)
crash course - Flex 2 (2006 五月四日)
crash course - Flash Media Server 2 (2006 七月六日)

Add comment | by admin

本日必讀 - ActionScript 2.0 Best Practices

In actionscript   February 23, 2006 - 12:04 pm

ActionScript 2.0 Best Practices (單頁方便列印版)

正在想如何重新改寫教材,現在問題解決一半了 Orz

只是現在才推這篇文章有沒有太慢了點,AS3 is right at the not so far corner…

1 comment | by admin

flash 8 自製 modal window

In actionscript, flash   February 14, 2006 - 2:46 pm

範例下載

在flash 裏要產生 modal window(只有前景的視窗可操作,背景所有東西都不能按)有兩種方式,一種是用 PopUpManager,另一種是用 Alert.create()。

一般正常用法是先透過 PopUpManager 產生一個 Window 元件,然後再用 Window.contentPath = xxx 將自已的東西放進去。

但這個做法有個缺點,如果你不想要那個固定格式(灰底 + titlebar)的視窗,就要很辛苦的動點手腳重新 skinning。

最近有個案子又需要這種功能,但設計師(hi Brad!)需要用自已的mc視窗,因此我寫了個小工具可以隨意指定自製的mc 成為 modal window, 原理其實很簡單,就是把 mx.managers.PopUpManager 打開讀完一遍懂了後就知道,讀完後就會知道其實 adobe 的工程師已經寫好許多方便的小程式等者被用,例如

1. DepthManager 裏面有 setDepthBelow(), createChildAtDepth()等程式可用
2. 這些 Manager都會隨者 Window 元件一起以 mixins 的方式加MovieClip身上。

如果你沒時間再走一遍整個流程,看看這個超短簡介也可以,基本上產生一個modal window的過程如下:

1、先產生一片超大的白色mc把整個畫面(Stage size)蓋住,然後在它身上吃掉所有的 mouse click event。

2、用 setDepthBelow() 將剛才產生的白底mc 移到 自製mc 的下方,這支程式會很聰明的將 自製mc 移到剛才 白色mc的上一層。

Actionscript:
  1. /*
  2. usage:
  3. @parent: 以那個mc為基準建立 modal window
  4. @mc: 要成為 modal window的視窗
  5. @alpha: 背景的透明度,預設 50%
  6. @color: 背景的顏色,預設 白色
  7. @released under creative commons 2.5, richtechmedia.com
  8. */
  9. function createModal(parent:MovieClip, mc:MovieClip, alpha:Number, color:Number){
  10.     var modal:MovieClip = parent.createChildAtDepth("modal", DepthManager.kTopmost);
  11.     modal.setDepthBelow(mc);
  12.     mc.modal = modal;
  13.     //
  14.     modal.resize = function(){
  15.         modal._width = Stage.width;
  16.         modal._height = Stage.height;
  17.     }
  18.     //
  19.     modal._alpha = (alpha)?alpha:50;
  20.     modal.resize();
  21.     modal.onRelease = undefined;
  22.     modal.useHandCursor = false;
  23.     //變顏色
  24.     if(color){
  25.         co = new Color(modal);
  26.         co.setRGB(color);
  27.     }
  28. }

至於關掉也很簡單

Actionscript:
  1. function closeModal(o:MovieClip, _modal) {
  2.     //trace("closeModal mc> " + o + " modal : " + _modal);
  3.     _modal.swapDepths(findNextAvailableDepth(0,_root,"up"));
  4.     _modal.removeMovieClip();
  5.     //
  6.     o.swapDepths(findNextAvailableDepth(0,_root,"up"));
  7.     o.removeMovieClip();
  8. }

1 comment | by admin

FMS2回傳 recordset 注意事項

In actionscript, flashcom   January 3, 2006 - 11:34 am

amfphp的作者Patrick Mineault 今天貼了一篇關於 FMS2回傳 recordset的文章

主要重點是當資料流向是 amfphp -> FMS2 -> flash player 時,
FMS2 與 flash player 分別會建立新的 recordset 物件來承載這些 resultset,但在兩次的轉換過程中,recordset.items 這個 getter 會被混謠,導致最後在 flash player裏用 recordset.items 是讀不到資料的。

之前我也曾大量使用類似這樣的三階式流程,但從來沒試過將 resultset 先傳回 flashcom 再丟回 flash player, 比較常見的劇情是 resultset (例如會員資料)傳到 flashcom後就留在那裏,所以不曾碰過patrick的這個問題,但將來顯然有機會碰到所以先記一筆備用。

不過,recordset 是一個已經正式宣告死亡的東西(不論在 AS3 或 Flex 2裏),所以最安全保險的做法就是自已先在server端生成 array of objects 再回傳,這樣不論要傳幾階都保証可久放不變質 :)

Add comment | by admin

Previous Posts

mobile phone