l

2017年8月19日 星期六

2016吉隆坡、馬六甲、新加坡考察之旅Day9-A新加坡國家博物館

August 18 18:00~18:38

飯店附的早餐,菜色不多但還可以吃飽。

Screenshot - 2017_8_18 , 下午 5_38_39Screenshot - 2017_8_18 , 下午 6_30_54

Screenshot - 2017_8_18 , 下午 6_30_31Screenshot - 2017_8_18 , 下午 6_30_41Screenshot - 2017_8_18 , 下午 6_30_45

***


今天早上要參觀新加坡國家博物館,離旅館走路大該20幾分鐘,決定用走的過去,順便欣賞新加坡街景。

Screenshot - 2017_8_18 , 下午 6_35_14

Screenshot - 2017_8_18 , 下午 6_35_09Screenshot - 2017_8_18 , 下午 6_35_18Screenshot - 2017_8_18 , 下午 6_35_29Screenshot - 2017_8_18 , 下午 6_35_37Screenshot - 2017_8_18 , 下午 6_35_49Screenshot - 2017_8_18 , 下午 6_35_58Screenshot - 2017_8_18 , 下午 6_36_05Screenshot - 2017_8_18 , 下午 6_36_11Screenshot - 2017_8_18 , 下午 6_36_16Screenshot - 2017_8_18 , 下午 6_36_27Screenshot - 2017_8_18 , 下午 6_36_54Screenshot - 2017_8_18 , 下午 6_37_00


▼9:40左右來到新加坡國家博物館,門口已經聚集了一些人。正在奇怪為什麼大熱天他們不入館的時候,才發現原來10:00才開館。只好在附近隨便逛逛等10:00。

Screenshot - 2017_8_18 , 下午 6_36_22Screenshot - 2017_8_18 , 下午 6_36_33


▼館內有特展和常設展,本來以為常設展免費,結果是新加坡國民和有永久居留權的人才免費,只好乖乖買票進場。

Screenshot - 2017_8_18 , 下午 6_37_15

***

▼一進館首先是新加坡建國史與李光耀的介紹,敘述新加坡從馬來聯邦「被獨立」的歷史。

Screenshot - 2017_8_18 , 下午 8_03_40Screenshot - 2017_8_18 , 下午 8_03_36

Screenshot - 2017_8_18 , 下午 8_03_46Screenshot - 2017_8_18 , 下午 8_03_52Screenshot - 2017_8_18 , 下午 8_03_58Screenshot - 2017_8_18 , 下午 8_04_07Screenshot - 2017_8_18 , 下午 8_04_12Screenshot - 2017_8_18 , 下午 8_04_34


▼還有英治時期、二戰日據時期,以及更多新加坡獨立的歷史。

Screenshot - 2017_8_18 , 下午 8_06_09Screenshot - 2017_8_18 , 下午 9_05_38Screenshot - 2017_8_18 , 下午 9_09_50

Screenshot - 2017_8_18 , 下午 8_05_45Screenshot - 2017_8_18 , 下午 8_06_03Screenshot - 2017_8_18 , 下午 8_06_21Screenshot - 2017_8_18 , 下午 8_06_33Screenshot - 2017_8_18 , 下午 8_06_41Screenshot - 2017_8_18 , 下午 8_06_55Screenshot - 2017_8_18 , 下午 8_07_15Screenshot - 2017_8_18 , 下午 9_04_47Screenshot - 2017_8_18 , 下午 9_05_00


▼遇到一群參觀的小朋友。

Screenshot - 2017_8_18 , 下午 9_12_42


▼霧鎖南洋,左邊這位女主角覺得好面熟,好像某位港星。

Screenshot - 2017_8_18 , 下午 9_14_10


▼博物館非常寬敞,人也不多,冷氣夠冷,不趕時間可以慢慢欣賞。

Screenshot - 2017_8_18 , 下午 9_09_59

Screenshot - 2017_8_18 , 下午 9_10_59Screenshot - 2017_8_18 , 下午 9_11_45Screenshot - 2017_8_18 , 下午 9_16_02

***

友藏內心獨白:應該很少遊客會來這裡吧。

2017年8月18日 星期五

《設計模式的逆襲》第N度復活:Factory Method

August 18 13:48~14:00

螢幕截圖 2017-08-18 13.49.51


打個廣告先,第十七梯次「Design Patterns這樣學就會了:入門實作班」招生中,上課日為9月16、17、23(六、日、六)。課程提供Java與C#程式範例。

***

Factory Method(工廠方法)是一個很常用也很簡單的設計模式,不過因為它有幾種變形,每個人對於這些變形的稱呼又不一定相同,所以還是經常會造成溝通上的誤會。

Teddy參考《Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing》書中的分類,把Factory Method分成三種:

  • Simple Factory Method:一個封裝產生具體類別過程的函數,又稱為Simple Factory。
  • Polymorphic Factory Method:GOF書中的Factory Method模式屬於這種類型,在父類別中定義產生物件的介面,讓子類別覆寫此介面以決定產生哪種具體類別。
  • Class Factory Method:又稱為Static Factory,類別靜態函數,用來產生自己或其他型別的實例。

但實際上有許多人將Simple Factory Method和Class Factory Method視為同一類,都稱為Simple Factory,也有人乾脆不分,直接統稱Factory模式。鄉民們在閱讀其他資料的時候請注意用詞不同的差異。

這次花了2.5天生產出Factory Method模式,檔案在此請安心服用。

一併提供之前完成的四個模式:

***

友藏內心獨白:看似簡單還是有一點小門道。

2017年8月15日 星期二

EiffelStudio 初體驗

August 18 11:49~13:09

螢幕截圖 2017-08-15 12.08.29

▲執行在macOS上的EiffelStudio


依合約設計

前幾天為了準備「敏捷開發懶人包:物件導向技能」課程範例,安裝了EiffelStudio。這是一個支援Eiffel語言的開發環境,有商業版和免費的社群版,Teddy安裝的是社群版。

Eiffel是一個支援Design By Contract(DBC;依合約設計)的語言,DBC的概念非常棒,可以協助開發人員思考與設計元件介面,透過合約(pre-condition、post-condition、class invariant)規範元件的行為。可惜的是主流語言並沒有支援DBC,原本Teddy想找Java和C#語言支援DBC的第三方元件,但後來發現幾乎都已經停止開發而且對於DBC的支援也不夠直接,所以幹脆不求人,回到Eiffel語言身上。

***

安裝EiffelStudio

EiffelStudio是一個跨平台的開發工具,支援Windows、macOS、Linux,但需要事先安裝C compiler。在Windows上可以使用Visual C++,在macOS使用Xcode,在Linux上用gcc。在Software Installation for EiffelStudio網頁有不同平台的安裝方式,Teddy在Windows 7 + Visual Studio 2015/2017以及macOS 10.12都安裝過。但是在Parallels中的Windows 10 + Visual Studio 2017安裝好之後出現找不到compiler的錯誤訊息,一時也不知道為什麼,後來就放棄Windows 10…Orz。

EiffelStudio開發環境和Eclipse、IntelliJ、Visual Studio 比起來相對「原始」很多,用起來有種時間回到10幾年前寫程式的感覺。不過當作練習DBC已經綽綽有餘,免費的就不要太挑剔。

***

合約

▼下圖中的MYSTACK類別是Teddy寫的用來展示最簡單DBC的例子,程式中的requireensureinvariant是Eiffel語言的keyword,分別用來指定pre-condition、post-condition、class invariant。

螢幕截圖 2017-08-15 12.17.44

***

里氏替代原則

合約除了在定義單一類別有用以外,在繼承的時候還可以用來確保是否違反Liskov substitution principle(LSP;里氏替代原則),又稱為subcontracting(子合約)

▼看一個例子,PERSON類別的set_age函數有一個pre-condition,要求年紀必須大於或等於0。

螢幕截圖 2017-08-15 12.27.42


▼CUSTOMER類別繼承自PERSON,它重新定義set_age函數,增加了一個pre-condition: 年齡大於等於18。

螢幕截圖 2017-08-15 12.26.35


▼實際測試CUSTOMER的set_age函數,故意傳5進去,請問這個例子是否違反了LSP?答案是沒有違反,因為在既成的關係中,子類別的和父類別的pre-condition兩者是or關係。也就是說子類別只要符合父類別或自類別所定義的pre-condition其中之一即可,翻成白話文就是:子類別要求的不能比父類別要求的還要多

螢幕截圖 2017-08-15 13.02.30


再看一個《Agile Software Development》書上的例子,  SQUARE繼承自RECTANGLE。

螢幕截圖 2017-08-15 12.42.59

螢幕截圖 2017-08-15 12.46.08


▼寫一個測試案例。

螢幕截圖 2017-08-15 12.57.24


▼程式執行之後Eiffel告訴我們SQUARE的set_height函數的post-condition: width = old width 這一條被違反了。如果鄉民們有仔細看SQUARE的程式碼,可能會覺得很奇怪,SQUARE又沒有定義這一條post-condition?沒錯,這一條post-condition定義在RECTANGLE身上。合約應用在繼承的時候,pre-condition是or關係,post-condition是and關係。LSP用合約來解釋就可以看得很清楚。

螢幕截圖 2017-08-15 12.50.42

***

雖然支援依合約設計的程式語言很少,但這個觀念卻非常簡單且實用,除了可以幫助我們設計元件介面,也可以因此自動產生測試案例,或者至少可以幫助我們設計測試案例。有空的時候安裝起來玩一下也不錯。

▼正港的Eiffel在這裡

螢幕截圖 2017-08-15 13.57.46







***

友藏內心獨白:。合約不死。

2017年8月10日 星期四

《設計模式的逆襲》第N度復活:Observer

August 10 12:00~12:59

螢幕截圖 2017-08-09 10.37.34


前幾天家裡有點事情在忙,有幾天都沒動 手寫書。後來不知道哪根筋不對勁,花了2天時間整理家裡。整理完畢之後突然覺得書房好亂,一堆書堆在地上,於是上網找看看有沒有類似圖書館的還書車,可以把常用的書放在上面。

▼很幸運地找到一台大小適中價格也可以接受的公事車,解決了困擾Teddy多年的問題。

螢幕截圖 2017-08-08 13.09.22


▼解決了書堆在地上的問題之後又覺得工作桌面太小,於是順便買了一台折疊式小餐車(照片左方)。電腦螢幕支援虛擬桌面,真實世界則需要實體桌面XD。

螢幕截圖 2017-08-10 12.35.49


▼兩台車擺在一起,有輪子真的很重要。

螢幕截圖 2017-08-10 12.40.01

***

工作環境升級之後回頭繼續寫書,選一個之前整理過的Observer(觀察者)模式,這次比較快只花了兩整天就寫好了,檔案在此歡迎批評指教。

一併提供之前完成的三個模式:

***

▼偷渡兩張小朋友睡覺的照片。

螢幕截圖 2017-08-10 12.53.20

螢幕截圖 2017-08-10 12.50.49

***

友藏內心獨白:還有什麼東西可以買的XD。

2017年8月3日 星期四

《設計模式的逆襲》第N度復活:Command

August 03 12:37~13:06

螢幕截圖 2017-08-02 08.15.08


打個廣告,第十七梯次「Design Patterns這樣學就會了:入門實作班」招生中,上課日為9月16、17、23(六、日、六)。課程提供Java與C#程式範例。

***

Kay常說Teddy做事情「開機很慢」,可是一旦開機之後做事情動作就很快。其實也不是Teddy喜歡拖,只是想把事情做好有很多事前工作需要準備。尤其是寫書、製作教材這種事,不認真做變成「誤人子弟」這個罪名可是擔當不起。

有些事情可以很敏捷、很靈活,小步 亂跑 快跑,收集回饋。有些事情則需要好好規劃,收集資料,醞釀、等待時機。

希望這次「開機」可以維持久一點,以四天完成一個pattern的進度估算,23 * 4 = 92,加上「一例一休」,順利寫完GoF 23個設計模式大約需要4個月的時間,也就是年底。

今天完成第三個模式:Command,檔案在此歡迎批評指教。

一併提供之前已完成的兩個模式:

***

友藏內心獨白:三個分類先各寫一個。

2017年8月1日 星期二

《設計模式的逆襲》第N度復活:Adapter

August 01 23:30~23:43

螢幕截圖 2017-07-30 07.39.10


昨天收到出版社編輯蕭小姐的來信,當天是她最後一天在出版社上班,之後要回家好好照顧小朋友。收到這封信Teddy內心有說不出來的感傷,當初蕭小姐主動寫信告訴Teddy可以幫忙出版《笑談軟體工程:敏捷開方法的逆襲》,在出版的過程中提供了很多寶貴的意見。也因為這本書順利出版,讓Teddy的創業路程順利不少。

兩年前跟蕭小姐提到準備寫《設計模式的逆襲》,無奈Teddy自己拖太久,這本書無緣請她當編輯了。俗話說:「世事無常」,道理大家都知道,但只有在親身遭遇的當下,才會有刻骨銘心的感受。

蕭小姐離開的出版社,更提醒Teddy要加緊寫書。要把握當下,雖然明天也許會更好,但不能把事情都推給明天

剛剛完成了Adapter(轉接器)設計模式,檔案在此有興趣的鄉民可以下載來看一下,對於內容有任何建議也歡迎直接告訴Teddy。

上次Singleton模式只有一位鄉民給Teddy建議,拜託有看過的鄉民們對於草稿內容有任何建議隨時告訴Teddy。感恩。

***

友藏內心獨白:有回饋才有進步。