l

2013年4月30日 星期二

為什麼例外處理那麼難(1):用途觀點

Apr. 29 10:18~12:26

image

 

上禮拜六、日Teddy抽出一些時間整理「例外處理設計與重構實作班」的教材,整理好100頁左右的投影片,大概是課程一半的內容。在整理過程中Teddy突然想到一則小故事…

***

話說N年前有一天Teddy在電視上看到李敖先生參加某個節目接受訪問,在受訪的過程中,李敖先生說了大意如下的一句話:「每個人都會罵王八蛋,但我李敖可以證明你是王八蛋不要告訴別人

***

要罵人是王八蛋很簡單,但是要「證明」一個人是王八蛋就要靠收集資料的功夫了,可不能像有些名嘴不做功課,光靠打打嘴砲就可以打混過去的。

看到這裡鄉民們又會想:「這和例外處理何干」?有寫過程式的鄉民們大該都會同意,例外處理是一件很困難的工作。但是,有沒有人想過,為什麼例外處理會這麼難、到底難在何處?唯有先分析問題,才有機會找出合適的解決方案。

螢幕快照 2013-04-29 上午11.08.52

Teddy內心獨白:每個人都說例外處理很難,但只有Teddy可以說明為什麼例外處理很難

***

其實說破了道理也很簡單:因為「例外處理」牽扯到好幾個相關但卻不相同的觀點或是面向,例外處理要做得好,這些觀點都必須要被關注到。Teddy認為例外處理至少涵蓋了以下五個觀點,這一集先談一下例外用途觀點。

  • Usage View(用途觀點)
  • Design View(設計觀點)
  • Handling View(處理觀點)
  • Tool-Support View(工具支援觀點)
  • Process View(流程觀點)

***

Usage View(用途觀點)

例外不就是例外嗎,還能有什麼其他用途?如果鄉民們這樣想就弱掉了。雖然理論上例外是用來表示failure(請參考《Fault、Error、Failure、Exception》這一篇),但是事實上例外還有可能被用來當作result classification與monitoring。當例外被當作result classification與monitoring時,並不是一種異常狀況,而是用來表達一種狀態通知,因此通常不需要加以特別處理

以上翻成白話文就是說:「寫程式遇到別人丟出例外時,請先判斷這個例外是用來但表failure,還是用來表示狀態通知(result classification與monitoring)」。看一個例子就知道:請問Java語言裡面的InterruptedException要如何處理?

螢幕快照 2013-04-29 上午11.37.03

 

這個問題N年前當Teddy第一次用Java寫多執行緒程式的時候,也是困擾了很久。InterruptedException明啊明是一個例外,可是為什麼捕捉之後卻沒有特別處理?經過N年之後,Teddy陰錯陽差投入例外處理研究之後才慢慢弄清楚,原來InterruptedException在這裡(上圖中的程式範例)並不是用來表達failure(某人辦事不力),而只是一種狀態通知,用來告訴等待或是執行中的執行緒有其他人把你給中斷了,請識相一點不要硬撐準備拍拍屁股可以做完收工了。這也是為什麼上面這個例子在捕捉到InterruptedException之後什麼都沒做的原因,在這裡如果硬要設計什麼「例外處理程式碼」,想要「拯救」被中斷的執行緒,反倒很有可能造成程式錯誤。

***

以上內容如果鄉民們能夠理解,恭喜您踏入了例外處理設計的大門。但是世間的事情如果都那麼簡單,黑白分明,事情就好辦了。要特別將「例外用途」提出來當成一個觀點來討論的原因,就是因為鄉民們通常無法直接透過例外物件本身來判斷這個例外是屬於哪種用途,而必須還要搭配application context來決定(由caller決定)

舉個例子,假設鄉民們正在開發藍光光碟撥放器軟體,這個軟體有一個自我測試的功能,用來判斷使用者的電腦夠不夠力播放高畫質藍光電影。在自我測試模式,應用程式如果持續接收到frame遺失例外,此時這個例外應該要被當成failure(電腦系統不夠力),並且將這個情況回報給使用者知道(錯誤處理)。

但是,當播放軟體處於正常模式,正在播放電影時若發生了frame遺失例外,此時就應該把這個例外當成是一種狀態通知,直接忽略不須回報給使用者(頂多log起來)。否則使用者在看電影的時候不是會一直被中斷,強迫按下「確定」或「取消」按鈕才可以繼續。這樣的播放軟體應該沒有人會想要使用吧挑眉質疑

***

每次寫例外處理的文章都要花特別久的時間嚎啕大哭,解釋完第一個觀點,還有其他四個下集待續。

***

友藏內心獨白:沒意外的話例外處理這門課今年7月6~7日應該是會開了。

2013年4月29日 星期一

第一梯次Design Patterns這樣學就會了進階實作班,Day3實況報導

Apr. 28 22:30~23:58

螢幕快照 2013-04-28 下午10.32.03

 

第三天課程介紹4個設計模式,首先介紹Visitor,Teddy設計的例子是「檢查與操作遊戲地圖編輯器所產生的地圖」。

螢幕快照 2013-04-28 下午10.50.45

 

套用Visitor模式的三個步驟如下圖所示。

螢幕快照 2013-04-28 下午10.53.52

 

Visitor模式最後以介紹一個Eclipse使用Visitor的例子作為結尾。

螢幕快照 2013-04-28 下午10.56.45

***

接下來上場的是Proxy,Teddy設計例子是10幾年前Teddy在設計一個Intranet-based進銷存系統的例子。下面兩張投影片中的畫面截圖可是Teddy「珍藏」多年的壓箱寶熱戀

螢幕快照 2013-04-28 下午11.00.09

螢幕快照 2013-04-28 下午11.00.30

 

1998年前後網路速度還很慢,當時的客戶從每個門市拉了一條14.4K的專線到總公司,在上線前夕才發現速度太慢,每一個畫面傳輸到門市都要等好幾秒。

螢幕快照 2013-04-28 下午11.01.42

 

還好當時Teddy讀了GoF的Design Patterns,套用Proxy這個模式在沒有大改系統的前提之下把這個問題給解決了。

螢幕快照 2013-04-28 下午11.08.40

***

倒數第二個模式,應該也是大部分的鄉民最少套用的模式,就是Interpreter 。Teddy設計了一個簡單的檔案處理語言作為Interpreter模式的練習範例。

螢幕快照 2013-04-28 下午11.15.05

 

Interpreter的實作其實不難,難的是…要先想辦法寫出正確的grammar。不過如果設計的語言不太複雜的話,這一點也不會太難,先拜一下Google大神,找看看有沒有跟自己設計的語言接近的grammar,參考別人的寫法再加以修改這樣會比較快一些。

螢幕快照 2013-04-28 下午11.17.38

 

逐步解釋範例語言的每一條grammar rule。

螢幕快照 2013-04-28 下午11.24.50

 

實作完成之後的執行結果。

螢幕快照 2013-04-28 下午11.23.21

***

Interpreter實作完畢之後有一個小小的測驗與問卷調查。

螢幕快照 2013-04-28 下午11.34.37

***

最後終於來到第23的模式Iterator。

螢幕快照 2013-04-28 下午11.38.13

 

Iterator和Observer類似,由於太常用了,所以很多語言都內建對於這兩個模式的支援。

螢幕快照 2013-04-28 下午11.37.17

螢幕快照 2013-04-28 下午11.37.28

***

以上,入門班與進階班加起來利用6天的時間將Christopher Alexander的模式原理、物件導向設計核心觀念、GoF書中的23設計模式全部都講解與實作一次,相信對於學員們日後工作上分析問題與設計系統應該會很有幫助。

螢幕快照 2013-04-28 下午11.42.31

 

學完全部23個設計模式,進度100%,好開心熱戀

螢幕快照 2013-04-28 下午11.48.37

***

最後,幫第四梯次的Design Patterns入門實作班打個廣告,上課日期是6月22、23、29(六、日、六),報名網址在此:http://www.accupass.com/go/pattern1306

041208899296854

***

友藏內心獨白:學了Interpreter之後就想要自己設計一個DSL了很棒

2013年4月28日 星期日

2012草山行館與陽明山賞櫻

Apr. 25 21:37~22:19

螢幕快照 2013-04-25 下午9.50.36

2012年2月Teddy和Kay到草山行館吃飯順便上陽明山賞櫻。話說草山行館在被「激進人士」放火燒掉之前Teddy去過好幾次,在裡面用餐或吃下午茶感覺還不錯。尤其是在非假日去遊客比較少,也比較清靜一些。經過後來的重建之後,好不容易又恢復營運,因此選了一天去舊地重遊一下。

***

吃飯先,以下是主餐和甜點。東西,看起來很精緻,但味道說真的,Teddy個人覺得普普而已,沒有令人很驚豔的感覺。而且,分量讓人吃完之後,有點小餓的感覺…Orz。

螢幕快照 2013-04-25 下午9.53.37

螢幕快照 2013-04-25 下午9.53.57

螢幕快照 2013-04-25 下午9.54.08

 

看到帳單之後,想起整修之前來這邊用餐好像沒有這麼貴啊?!難倒是要把整修的費用賺回來?貴也就算了,用餐的環境也不好,因為有開放遊客參觀,所以邊吃飯,身旁不時有遊客會「路過」順便拍照…惱怒,這次體驗之後,下次再去吃飯的慾望幾乎降到0。

螢幕快照 2013-04-25 下午9.54.18

***

吃完飯之後Teddy和Kay也變身為遊客,在草山行館中到處拍照。

螢幕快照 2013-04-25 下午10.03.55

螢幕快照 2013-04-25 下午10.04.02

螢幕快照 2013-04-25 下午10.04.14

螢幕快照 2013-04-25 下午10.04.39

螢幕快照 2013-04-25 下午10.04.59

螢幕快照 2013-04-25 下午10.05.22

螢幕快照 2013-04-25 下午10.05.30

 

草山行館的平面圖。

螢幕快照 2013-04-25 下午10.05.44

螢幕快照 2013-04-25 下午10.06.12

***

離開草山行館之後徒步走到陽明山。當天下著綿綿細雨,沒有在戶外拍太多照片,以下三張請鄉民們加減看一下挑眉質疑

螢幕快照 2013-04-25 下午10.07.30

螢幕快照 2013-04-25 下午10.07.12

***

友藏內心獨白:拜託不要再縱火了,不然又要漲價了不要告訴別人

2013年4月27日 星期六

2011李國鼎故居

Apr. 11 22:49~23:20

2011年9月Teddy和Kay來到臺北市泰安街2巷3號的李國鼎故居參觀。李國鼎先生曾任經濟部與財政部部長,是有名的清官,也是當年台灣經濟奇蹟的重要推手。看到台灣的現況,遙想當年,更是…Orz。

螢幕快照 2013-04-11 下午10.55.30

螢幕快照 2013-04-11 下午10.55.20

螢幕快照 2013-04-11 下午10.57.58

 

入內之後有一個當初車庫(還是佣人房,有點忘了)改建的小建築物,可先在這裡觀看介紹李國鼎先生的影片。

螢幕快照 2013-04-11 下午10.55.55

螢幕快照 2013-04-11 下午10.56.15

螢幕快照 2013-04-11 下午10.56.08

螢幕快照 2013-04-11 下午10.56.38

李國鼎先生的故居不出所料的也是一棟日式建築,需要有人導覽才可入內參觀。屋內是不開放攝影與拍照,所以只能看看屋外與庭園的照片

螢幕快照 2013-04-11 下午10.55.02

螢幕快照 2013-04-11 下午10.55.42

螢幕快照 2013-04-11 下午10.56.51

螢幕快照 2013-04-11 下午10.56.58

螢幕快照 2013-04-11 下午10.57.04

螢幕快照 2013-04-11 下午10.57.17

螢幕快照 2013-04-11 下午10.57.25

 

最後看一張全景圖。

螢幕快照 2013-04-11 下午10.57.43 1

***

根據維基百科的資料,李國鼎先生中央大學物理系學士、英國劍橋大學物理系碩士。1937年中日戰爭爆發後,當時已得到博士學位獎學金的李國鼎決定放棄學位返國,為國效力(落淚很棒)。一個學物理的人,最後居然做到經濟部與財政部部長。Teddy由衷認為,台灣的高官們,應該少些法律出身的人,多些工程師,整個國家可能會比較有希望一點。

***

友藏內心獨白:律師者也,知法玩法,依法行政?