l

2013年7月31日 星期三

重新整理State Pattern

July 30 10:29~11:45;15:22~16:20

螢幕快照 2013-07-30 上午10.42.20

Teddy今天在公司所做的練習微笑

 

在第四梯次「Design Patterns這樣學就會了入門實作班」的第二天課程中,有一位學員在休息時間拿了他用context、force、problem重新整理過的State模式找Teddy討論。這門公開班課程上了四次,這還是第一次有學員當場自行做這樣的練習,讓Teddy非常感動很棒

類似的練習,Teddy之前也曾經做過,請參考《尋找Force實驗2:State Pattern篇》和《Behavioral Patterns要解決什麼問題(一)?》。最近Teddy對於context、force、form有一些新的體驗,今天有點時間就再來練習一次好了。

Teddy在《設計的定義》提到:「設計是決定form、context,以及兩者之間的關係。」所以Teddy先畫出下面這個圖,開始思考State模式的form、context、force各是什麼。

螢幕快照 2013-07-30 上午11.01.33

 

第一步,從Form開始

因為pattern是整理已經存在的設計,所以在探討form、context、force的時候,第一步就是先把form(也就是solution)寫出來。為什麼?因為GoF已經幫鄉民們把form設計好擺在書上,只要把它描述出來就可以了。有了form之後,反推force與context就比較容易。

把GoF的書翻出來,第306頁就有State模式的form(下圖上半部)。這個form是套用State模式之後的form,如果可以把套用之前的form也畫出來,兩相比較之下,就更容易判斷是怎樣的force,導致before與after的差別(減肥前、減肥後,美容前、美容後的差別)。

螢幕快照 2013-07-30 上午11.06.26

 

這是Teddy在上課時所舉的例子,套用State模式之前程式中出現許多與狀態相關的重複程式碼。從實際的程式碼範例也可以觀察到force。

螢幕快照 2013-07-30 上午11.13.39

 

第二步,尋找Force

State模式的force,Teddy在《尋找Force實驗2:State Pattern篇》已經找過一次,這裡再列出來一次:

  • 在物件的operation中使用條件判斷式,並依據狀態改變物件行為的這種作法雖然很直覺且簡單,但是會造成物件不同的operation中會出現多處重複的條件判斷式,造成日後維護與擴充的困難度。
  • 由於物件的行為隨著狀態而變,因此若是一個物件的所有行為全部都放在物件自己身上,則容易造成單一物件程式碼太長,同樣增加維護與擴充的困難度。
  • 當物件狀態很多的時候,如果狀態改變的邏輯無法很清楚的被表達出來,則程式可能不容易被理解。

Teddy今天重新整理的force的結果剛好也找到三個,不過內容比較簡短一些:

  • 把所有與狀態相關的程式碼寫在一個物件內,則該物件的程式碼會太多,不好理解與修改(違反Open-Closed Principle)。
  • 物件容易存在許多與狀態相關的重複程式碼。
  • 單一物件狀態太多,變得不易測試。

以上這些force,更抽象一點來說,就是modifiability、extendibility、testability、understandability的問題。這幾股力量,把原本的form(全部和狀態有關的程式都寫在一個物件裡面),擠壓成後來就變成了State模式的form(由原本單一物件搞定全部的事情,演變成context、state、concrete state這三種不同的物件互相合作來完成原本的工作)

 

第三步,定義Problem

簡單一點來看,problem就是form的相反(把解答反過來就變成問題)。既然State模式的form已經設計好了,problem應該也很簡單才對。所以,第一個problem的版本只要把GoF書中關於State模式的intent改成問句就好了:

Problem(v1):How do you allow an object to alter its behavior when its internal state changes so that the object will appear to change its class?

以上這個問題的敘述,非常明確,剛好可以對應到State模式的解決方案。

另一種定義problem的角度,是從「GoF書中所有的behavioral pattern想要解決那些問題」作為出發點。Teddy在《Behavioral Patterns要解決什麼問題(一)?》做過這樣的練習,得到的問題是:

Problem(v2):How do you assign responsibilities between objects to manage complex control flow?

第二版本的problem,就比較抽象一些。

 

第四步,釐清Context

既然「設計是決定form、context,以及兩者之間的關係」,form已經有了,要決定context「理論上」應該很簡單才對。事實上,說簡單也沒那麼簡單,context可大可小,端看描述這個pattern的人眼中是如何看待這個世界。

在GoF書中,在State模式的Motivation章節,用一個TCPConnection作為例子,算是一種給定context的作法。GoF設計模式的context還可以從Applicability章節來尋找。

Context:一個物件的行為會因為物件自身狀態不同而表現出不同的行為,例如一個自動販賣機物件,同樣一個「選擇貨品」按鈕,會因為顧客有沒有投錢、投了多少錢、販賣機有沒有零錢、貨品是否賣完,而有著不同的反應。

***

最後把今天整理State模式的結果重新謄寫一遍:

Name:State

Context:一個物件的行為會因為物件自身狀態不同而表現出不同的反應動作,這在程式開發中是一個很常見的情況。例如一個自動販賣機物件,具備「選擇貨品」的功能。同樣一個「選擇貨品」功能,會因為顧客有沒有投錢、投了多少錢,而有著不同的行為反應。

Problem:當物件內部狀態改變時,你要如何讓它的行為也跟著改變,就好像這個物件換了另外一個人似的?

Force:把所有與狀態相關的程式碼寫在一個物件內可以讓物件依據狀態改變行為,但:

  • 物件的程式碼很容易變得太長,不好理解與修改(而且會違反Open-Closed Principle)。
  • 物件容易存在許多與狀態相關的重複程式碼。
  • 單一物件狀態太多,變得不易測試。

Solution:將物件中與狀態相關的行為抽離出來。設計一個State介面,針對每一個狀態,新增一個實作State介面的Concrete State物件。把物件中與狀態相關的行為移到相對應的Concrete State物件之中。讓物件擁有一個指向State介面的成員變數,藉由改變State成員變數所指向的Concrete State物件,來改變原始物件的行為。

 

螢幕快照 2013-07-30 下午4.15.59

圖片來源在此

***

整理之後的State模式,好像真的有比較容易理解一點耶熱戀。以上整理,雖然不算完美,但總算是一個開始。至於resulting context,就留給鄉民們當作家庭作業自行練習。

寫到這裡突然覺得,為什麼談設計與設計模式的相關文章,都搞得好像在寫論文一樣。

***

友藏內心獨白:說好的「設計模式的逆襲」哩?挑眉質疑

2013年7月30日 星期二

[還少一本書] 向孔子學領導

July 29 14:23~15:22

螢幕快照 2013-07-27 下午11.37.23

 

昨天介紹了《工作大解放 (Rework)》,今天介紹Teddy上禮拜讀完的另一本書《向孔子學領導:36堂一生必修的論語課》。這本書是「石滋宜」先生最新的著作,Teddy年輕的時候石滋宜先生擔任「中國生產力中心」的總經理,那時候在電視上聽過幾次石先生的演講,覺得他是一位非常腳踏實地,很誠懇與有能力的人。再加上石先生也是台北工專校友,雖然Teddy從沒有見過他本人,但對他印象一直不錯(在此先聲明一下,Teddy比石先生年紀小很多 XD)。

Teddy當年還在念國中的時候,有一段時間曾經很無聊的自己跑去買了一本論語來「背」,希望在聯考作文可以用上一些名言佳句,得到高分挑眉質疑。很可惜,背了幾則之後覺得很無聊,又無法體會箇中的含意,也就停了下來。在這本書中,石先生用他的語言來闡釋論語,淺顯易懂。當年Teddy背誦的哪幾則論語,經過石先生的說明,別有一番滋味。

以下節錄幾句Teddy特別喜歡的內容:

  • 一個人會受人尊敬或被人唾棄,就看他如何面對自己的錯誤。
  • 要有主見,不要獨見。
  • 我認為領導者主要的職責,在於營造健康合理的成長環境。長久以來,台灣需要的一直是能夠有領導者塑造出講真話不怕被懲罰的環境。所以,寬愛、包容是很重要的。
  • 你的話語就代表你的思維、立場、甚至一項政策,亦可視為一種責任。但倘若只是恣意「隔空喊話」,沒有任何「行動」,那也只是「妄念」,結果無異是「自殺」。
  • 你必須先讓自己成為一個值得信賴的人。如何做到?唯有透過內向修練,自然的從內心出發。你想的、說的、做的都要一致,而且永遠不背離這樣的原則。
  • 成功領導者往往擁有幾個共同特質:好學;懂得傾聽與溝通;專注與堅持於自己的領域,做人做事都有一貫性;能夠與人建立起信賴關係。
  • 懂得承認錯誤的人,才是最好的領導者。
  • 領導者不是個指導者,而是個發問者,以一連串相關的問題,去激發員工的思考。
  • 孔子曰:「所謂大臣者,以道事君,不可則止。」(所謂大臣,應該以仁道輔佐君王,如果行不通,寧願辭職。)
  • 國家越腐敗,法律就越多。同樣的道理是否也適用於公司,也就是規範越多,公司越腐敗呢?
  • 子曰:「舉直錯諸枉,則民服。舉枉錯諸直,則民不服。」
  • 面試時不要僅是探索對方的過去(學經歷等),而是要談他的未來(胸襟與抱負)!因為我們雖然可以從過去的經歷得知一個人做事的能力,卻很難知道他做事的態度,而態度正是我們用人的首要考量。
  • 子曰:「視其所以,觀其所由,察其所安。人焉廋哉?人焉廋哉?」
  • 一流的企業文化,最可貴的不是「High Tech」(高科技),而是「High Touch」(高感性)。(Teddy內心獨白:High Tech, No Touch挑眉質疑
  • 變革工程劃分為三個層次效益:效果最小的是「流程變革」…效果其次的是「組織變革」…效果最大的是「思維模式的改變」。
  • 在快速變化的今日,過去成功的延長線,注定將是失敗的軌跡。…過去享受過成功果實的人,以及無法察覺環境變化的人,是最難以改變的。
  • 子曰:「為政以德,譬如北辰居其所而眾星共之。」

***

領導與管理,講穿了就是做人做事的道理。這些道理,2千多年先的古人已經想通了。現在學,還不算晚。

***

友藏內心獨白:有些論語的句子,以前考試的時候曾經出現在閱讀測驗題目中。

2013年7月29日 星期一

[還少一本書] 工作大解放 (Rework)

July 28 21:55~23:08

螢幕快照 2013-07-28 下午9.28.08

 

2~3個禮拜前一位朋友問Teddy,有沒有讀過《工作大解放(Rework)》這本書。因為這位朋友覺得Teddy平常跟他提到的很多做事方法與觀念,和這本書中的內容非常類似。Teddy沒有讀過這本書,朋友的說法引起Teddy對這本書的興趣,上禮拜在「化工廠關係企業」網站買了這本書,花了兩個晚上把書讀完(Teddy內心獨白:雖然很努力在抵制化工廠,但可以把書寄到化工廠門市部取件還是挺方便的挑眉質疑)。

這本書,創業者要看,敏捷開發團隊要看,閒閒沒事的人要看,忙到爆肝的人更是要看。書中充滿了agile與lean的精神,沒有冗長的理論,只有濃縮再濃縮,提煉再提煉,精簡到不能再精簡的實用建議。

Teddy特別喜歡以下這幾篇:

  • 別當工作狂:工作狂沒掌握要點。他們試圖以耗費大量時間來解決問題,不想動腦袋,只想以蠻力來彌補智力上的怠惰,因而產生粗糙的解決方案。…工作狂不是英雄,他們沒有扭轉局面,只是耗盡時間。真正的英雄已經回到家裡,因為他們找到更快完成事情的方法。(請參考《加班,加班,我愛你》、《我無能,所以我加班》)。
  • 搔到自己的癢處:在開發產品或服務時,每天都得做出好幾百個小決定。如果你著眼的是怎樣解決他人的問題,會一直覺得在黑暗中摸索。但當你解決的是自己的切身問題,便會覺得曙光乍現,你會知道什麼才是真正的正確答案。
  • 坐而言不如起而行:真正重要的是你做了些什麼,不是你想要、想說,或是打算做些什麼。
  • 做出決定就是進步:盡可能把「讓我們再想一想」轉換成「讓我們做出決定吧」。一定要做出決定,不要等待完美的解決辦法,決定後就可以往前。
  • 你的估計能力爛透了:我們都是差勁的預估者。我們以為能夠猜出某件事情需要多久來完成,但我們其實一點概念也沒有。我們判斷事情的進展,都是根據最佳狀況,也就是不會因為不可避免的突發事件而拖延。但現實情況向來跟最佳情境不一樣。(請參考《這是電腦估的喔》)
  • 不要抄襲:模仿瘩問題在於:它跳過了理解的程序,也就是你並不理解你是怎樣成長的。…如果你只是一味的複製和貼上,你就錯過了那個理解過程…。…你可以受影響,但不要剽竊(關於剽竊的說明,請參考Teddy在2010年所寫的這一篇《剽竊》)。
  • 他們不是十三歲:你把人當小孩子看,得到的就是「小兒科」的工作成果。
  • 讓員工五點下半:你並不需要更多時間,你需要的是更妥善的利用時間。…你不應該期望工作是一個人的全部人生,想要留住你的員工,就別這麼想。
  • 不要第一次受傷就留下疤痕:政策是機構的傷疤,是對不可能再次發生的情況過度反應,這是種對個人不良行為的集體懲罰。這就是官僚機構形成的方式,沒有人會刻意打造一個官僚機構,政策是慢慢溜進公司的,每制定一個政策,就會留下一道傷疤。

這本書,真的很棒。快去買一本來看吧。

***

友藏內心獨白:英雄所見略同熱戀

2013年7月28日 星期日

2013金門考察之旅Day1-H三角堡與紀念碑

July 23 18:13~18:39

離開古寧頭播音牆之後準備回金城鎮吃飯,回程經過慈湖旁的三角堡。可惜已經快下午6點,三角堡已經關閉,只能在外面逛一下。

螢幕快照 2013-07-23 下午6.14.09

 

三角堡的圍牆,此堡雖小卻還有護城河喔。不對,應該是「護堡河」。

螢幕快照 2013-07-23 下午6.15.09

 

附近展示了數量戰車,應該是Teddy在金門看到數量最多的戰車。

螢幕快照 2013-07-23 下午6.14.32

螢幕快照 2013-07-23 下午6.14.47

 

還有象徵心戰喊話的大聲公,沒想到這個大聲公居然是對岸人士的創作。

螢幕快照 2013-07-23 下午6.15.01

螢幕快照 2013-07-23 下午6.15.22

 

黑白照片的戰車。

螢幕快照 2013-07-23 下午6.19.38

 

慈湖。

螢幕快照 2013-07-23 下午6.15.48

***

離開三角堡之後不久又路過另一個景點:日軍強徵金門馬夫殉難紀念碑。

螢幕快照 2013-07-23 下午6.29.54

 

這裡比較像是一個公園,很多當地鄉民來這裡休息。由於就位在海邊,可以欣賞海景。

螢幕快照 2013-07-23 下午6.31.23

螢幕快照 2013-07-23 下午6.32.52

 

螢幕快照 2013-07-23 下午6.31.30

螢幕快照 2013-07-23 下午6.31.44

螢幕快照 2013-07-23 下午6.32.03

 

對岸就是廈門。

螢幕快照 2013-07-23 下午6.32.34

 

仔細看,可以看到廈門的高樓大廈。

螢幕快照 2013-07-23 下午6.31.52

螢幕快照 2013-07-23 下午6.32.18

***

友藏內心獨白:Day1的行程也太多了一點吧。

2013年7月27日 星期六

2013金門考察之旅Day1-G古寧頭播音牆

July 23 17:25~17:58

離開古寧頭戰史館,來到附近的古寧頭播音牆。不過這個點有點不太好找,經過一些鄉間小路之後才到達目的地。

螢幕快照 2013-07-23 下午5.40.42

螢幕快照 2013-07-23 下午5.40.54

螢幕快照 2013-07-23 下午5.35.32

螢幕快照 2013-07-23 下午5.35.48

 

現在剩下觀光功能。

螢幕快照 2013-07-23 下午5.30.13

 

近看還蠻壯觀的,現場重複撥放鄧麗君當年到金門錄製的一小段談話,接著播放鄧麗君的歌曲,還蠻有fu的很棒

螢幕快照 2013-07-23 下午5.36.52螢幕快照 2013-07-23 下午5.31.43

螢幕快照 2013-07-23 下午5.33.40

螢幕快照 2013-07-23 下午5.36.05

古寧頭播音牆的地點離廈門好近。

螢幕快照 2013-07-23 下午5.31.26

 

當天雖然視野不太好,但是依稀還是可以看到隔海的廈門。

螢幕快照 2013-07-23 下午5.37.16

 

古寧頭播音牆附近海灘,風景很美。金門的海岸邊,到處都插滿了反登陸樁,當年戰時為了防止漲潮時對岸的船隻搶灘登陸。不知道這些反登陸樁現在是否還有實際用途?插滿反登陸樁的海岸給人一種敬而遠之的感覺,人走在沙灘上好像不小心會被刺到挑眉質疑

螢幕快照 2013-07-23 下午5.31.56

螢幕快照 2013-07-23 下午5.32.13

螢幕快照 2013-07-23 下午5.37.41

螢幕快照 2013-07-23 下午5.34.00

螢幕快照 2013-07-23 下午5.38.07

螢幕快照 2013-07-23 下午5.36.40

***

來到古寧頭播音牆已近下午5:20,現場遊客不多,倒是有好幾位看起來是當地人的鄉民。不知道是時間太晚還是地點偏避遊客較少來,總之這個景點還蠻特別的,值得一遊。

***

友藏內心獨白:小鄧的歌很好聽。