2009年8月17日

政治指南針:政治偏左,經濟偏右

剛剛做了政治指南針這個測驗。
傾向跟我自己的認知差不多,不過程度比我想像中的低很多。


就某種意義來說,我其實是個騎牆派。 :p

2009年8月16日

[Plurk] 透過 MSN 收發噗浪

不知道為什麼 Plurk 把即時通訊機器人(IM Bot)的設定藏在很奇怪的地方。
我簡單地整理了一下,提供給有需要的人。 :)

首先點左上的的通知


然後切換到「提示2」


「現在就開始吧」!


選取一個即時通訊服務(MSN、Yahoo 即時通、Google Chat等)


選擇好後,別忘了輸入你的帳號,然後按下「Sign Up」!



一切沒問題的話,你會收到噗浪機器人加你為好友的通知。
將它加為好友,並告訴它你的噗浪帳號(以 MSN 送出你的 Plurk 帳號),就大功告成了!

以後你只要傳 MSN 訊息給這個機器人,它就會將你的訊息發佈到噗浪上;
有新的噗它人也會即時通知你。

後續使用細節可以參考:

2009年8月6日

[Design Patterns] 論 Template Method 與 Strategy (下)

前一篇文章提到:採用 Design Patterns 書中對 Template MethodStrategy 的(形式)定義,很難在動態語言中區隔兩者的不同。
是因為這兩個 pattern 在本質上是相同的呢,或者是有其他的判斷方式?讓我們回過頭去看看先前被我忽略掉的部分--pattern 的目標/意圖--能不能回答這個問題。

根據 C2 Wiki,Template Method 的目標為「定義一個演算法的骨架,將其中的某些步驟延遲到子類別才決定」(*1)。也就是說此 pattern 應該要具備「(固定的)演算法骨架」與「(未決定/可變動)的演算法步驟」兩個要素,其中「步驟」的主要作用在於實現該演算法,且其具體內容應該要遵循「骨架」的規範或限制。

Template Method 的「骨架」除了抽象類別的形式,也可以由定義了「步驟」規範的介面與使用該介面的 client 所組成;而原本由子類別提供的具體「步驟」內容則由實作該規範介面的類別提供。事實上,這樣的形式反而更接近 Wikipedia 上的描述(*2)。
那麼這種非抽象類別的形式,會不會也是 Strategy pattern 呢?

C2 Wiki 對於 Strategy 的目標描述是「定義多個演算法,各別封裝這些演算法,並讓它們可以互換」(*3)。所以其特徵為「一組彼此獨立且可互換的演算法」,至於使用這些演算法的 client 部分並不在此 pattern 討論的範圍內。

在前述非抽象類別形式的 Template Method pattern 中實作了「步驟」規範介面的類別其實可以視為 Strategy pattern 的一種;不過「骨架」部分則不在 Strategy pattern 範圍中。所以兩個 pattern 在這種形式下是互相合作,而非表示相同的概念。

結論呢?上面就寫了半天,我實在沒辦法做什麼有力的結論了。
簡單說一下心得:雖然 pattern 的說明與呈現通常著重在形式上,但在學習形式的同時,應該要瞭解其中每個部分所扮演的角色與具備的特性。最好可以再進一步瞭解 pattern 隱含的精神。就像張無忌學太極一樣,學到把招式都忘記你就成功了!!(開始亂掰了……)


1. Template Method Pattern (C2 Wiki)
2. Template Method Pattern (Wikipedia)
3. Strategy Pattern (C2 Wiki)

[Design Patterns] 論 Template Method 與 Strategy (上)

昨天在 Plurk 上面回了 fcamel 一段話(*1):
我以為 "template method" 改用組合就是 "strategy" 了 :p
不過我想會分成兩種 pattern ㄧ部分也是因為靜態語言的特性使然吧
由於 Plurk 會限制字數,不太適合發表長篇大論。所以我打算透過這系列文章把想說的東西表達清楚一點,並且討論一下這兩個 pattern。

Design Patterns 對這兩個 pattern 的描述如下:
Template method
defines the skeleton of an algorithm as an abstract class, allowing its subclasses to provide concrete behavior.
Strategy
allows one of a family of algorithms to be selected on-the-fly at runtime.
在這樣的定義下,如果採用組合(composition)的形式,自然不會是 Template Method Pattern。而不論在靜態或動態語言中組合關係都是可以在執行時期才決定的。所以我認為(在上述的定義下):「"template method" 改用組合就是 "strategy" 了」。

在靜態語言中,類別的內容必須在執行時期前就確定。因此提供 Template Method Pattern 中具體行為的子類別自然不會落在 Strategy Pattern 的範疇中。反之,由於動態語言允許執行時期修改類別定義,而讓一個類別有可能同時被用來實現這兩個 pattern。這是我回文後半段所沒說清楚的部分。

當然,前面論述採用了比較狹義的 pattern 定義;而且我只討論了 pattern 的形式,而忽略套用 pattern 的動機(也就是 pattern 所想解決的問題)。但這些已經超過原本 Plurk 回文想說的內容,所以我將這部分留在後續文章中討論。(謎之音:擺明就是要拖稿嘛)


1. 這則 plurk 在