Skip to content

Instantly share code, notes, and snippets.

@caasi
Created November 7, 2012 12:48
Show Gist options
  • Save caasi/4031421 to your computer and use it in GitHub Desktop.
Save caasi/4031421 to your computer and use it in GitHub Desktop.
About Advanced ActionScript 3 with Design Patterns

About Advanced ActionScript 3 with Design Patterns

那天和你提到這書中用到很多 Interface,現在認為 Interface是個有點雞肋的東西,那時也舉不出他為什麼要用 Interface的好例子。現在書在手邊,來列一下他在哪邊用到了些什麼 Interface。

另外,書的前面談組合與繼承時有些有趣的觀點,像是認為繼承破壞封裝(指父類別的更動很容易影響到子類),談到組合的不足時則認為要寫更多的程式碼(我以為這是可以靠語言的 reflaction或是 IDE的神奇功能,像是自動重構來補足?),另外一個組合的不足則是不好讀。這邊沒寫過大東西,就沒什麼話講了。

從這部份看,我猜,他使用 Interface而不直接繼承,應該是為了避免繼承的缺點,擁抱組合的靈活性,到真的要繼承時也不會有困擾。

另外手邊的是簡中版,下文章節名稱也先用中文。

第二章:接口編程

先舉了 A, B與 IExample,沒啥特別的。

ISearchable與實現它的 Library和 Help

例子中的 Library與 Help實作方式不同,弄個 abstract類或是靠 Interface沒差。

實現繼承了 IEventDispatcher的 INetworkProtocol

基本是在解決多重繼承的問題。

第五章:工廠方法與模板方法模式

每個 AbstractGame的子類對有個對應的 Field類,但沒有 AbstractField,大概是因為所有的 Field類都得自己實作 IField中的 protocol。

第六章:代理模式

IProduct與 Product和 XMLProductProxy

解決 proxy問題,基本上如果 XMLProxy可以問問 Product有啥 method就沒有 IProduct存在的必要XD

第七章:迭代器模式

出現了和 Null Object一樣可愛的 Null Iterator,但如果把 Null Iterator當成父類,搞不好也可以不用 Interface。我能想到唯一的問題是語意上的,如果在 C++可以偷偷用 define避免掉吧XD 不然還是得生一個 AbstractIterator來。

第八章:組合模式

這讓我想起 AS3的 DisplayObjectContainer, DisplayObjectContainer也是個 DisplayObject,但它裡面又有著 DisplayObject集合。

但 AS3自己沒有 IDisplayObject這個 Interface,反而其他的 AS3庫有把這個 Interface做出來。簡單查了下,有一說是認為 DisplayObject不太有機會被多重繼承到,所以沒有這個 Interface。

回題,書中舉了檔案系統為例,開始變複雜了,該用 JS來做看看嗎? D:

--

待續

@godfat
Copy link

godfat commented Nov 7, 2012

唔,我現在覺得像是這樣的東西其實都要看實例,很難說哪個比較好
所以... XD

第八章:組合模式

哈!正好我讀物件導向正是透過 actionscript, 而且我腦裡想到的跟你一樣,
只是那時候是 MovieClip 就是了。說來我覺得我們的過程好像也不少是重疊的 XDD

不過我還是覺得區分 interface 或 abstract class 實在太笨了,應該要像 scala/ruby 那樣才對
純粹的 interface 只是自找麻煩... :/ 何必區分有實作跟沒實作的差別?
假設 interface A 跟 interface B 同時都有某個 method, 然後同時使用時,那是叫誰?
說有順序可以用,那繼承或是混合(mixin)又怎麼不會有順序?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment