l

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。感恩。

***

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

2017年7月28日 星期五

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

June 28 22:59~23:19

螢幕截圖 2017-07-28 23.19.02


大概2年多前就「公開嗆聲」要寫《設計模式的逆襲》,後來花了時間整理書本章節目錄,也動手寫了一兩篇,但總覺得怪怪的,還少了些什麼。

這本書有好幾個作用力(forces)需要考慮:

  • Teddy特別想談的倒不是GoF設計模式,而是Alexander的pattern設計方法。Alexander的設計方法應該要佔這本書最重要的份量。
  • 既然談了Alexander的設計方法,應該也要談一下軟體設計模式社群的歷史與演進過程。
  • 上面這兩件事情交代完畢之後,就可以談GoF的23個設計模式。關於這部分Teddy最想做的是把GoF設計模式改用Context、Problem、Forces、Solution、Resulting Context這種格式重寫詮釋,這也是一個不小的功夫。
  • 最後,如果上面這三件事情都做到,那這本書不就要厚到嚇死人的地步?書的頁數也是一個很強烈的force,這又限制了前面想做的這三個目標。

後來腦筋卡住,加上有其他工作在忙,三不五時又生個小病什麼的,就把寫書的事情丟到一邊。最近有點時間,覺得還是應該想辦法完成《設計模式的逆襲》,後來想到一個做法:把原本top-down的寫作思維改成bottom-up,也就是根本不要管這本書最後寫出來會變成什麼樣子,而是先把個別元素準備好,最後再看看要怎麼整合成一本或N本書

***

花了四天的時間先整理好Singleton(獨體、單例)設計模式,檔案在此有興趣的鄉民可以下載來看一下,對於內容有任何建議也歡迎直接告訴Teddy。

***

友藏內心獨白:感恩。

2017年7月24日 星期一

幫Macbook Pro 15” Late 2016尋找外出電源轉接器

June 23 21:40~23:43

螢幕截圖 2017-07-23 23.43.03


Apple原廠電源轉接器的問題

在〈幫Macbook Pro 15” Late 2016尋找外接4K 27”螢幕〉Teddy提到新買的ASUS MX27UC 27吋4K AH-IPS螢幕可以直接幫Macbook Pro 15” Late 2016充電,所以原廠的電源轉接器就空出來可以做為外出使用。Teddy除了家裡、公司以外,有時候會到客戶家上課或提供顧問服務。原廠的電源轉接器體積有點大,外加那一條長達兩公尺的USB-C充電連接線實在是不好收納,覺得原廠的電源轉接器攜帶上實在不太方便,所以想找看看有沒有其他比較輕便的替代品,原廠的電源轉接器就直接放在公司使用。

▼Apple 87W USB-C 電源轉接器與USB-C充電連接線。畫面節錄自Apple官網。

螢幕截圖 2017-07-23 22.13.58螢幕截圖 2017-07-23 22.13.47

***

替代方案

前幾天在網路上找了一下,看到Innergie PowerGear 45瓦 USB-C筆電充電器,原本是設計給Apple Macbook使用,所以只有45瓦,而Macbook Pro使用的電源轉接器是87瓦,感覺好像不合用。

▼畫面節錄自PChome。

螢幕截圖 2017-07-23 22.19.06

但後來在網路上又找了一些資料,有鄉民提到瓦數雖然不足但是還是可以對Macbook Pro充電,只是充電速度比較慢。Innergie是台達電製造,價錢也只有原廠的一半(瓦數比較小價錢比較便宜也是應該的),重量也比較輕,就買一組來試看看。

當時在Momo購物網看到Innergie PowerGear 45瓦只賣1437元,比PChome又便宜了一點,就在Momo買了一組。

***

開箱照

▼包裝長這樣。

螢幕截圖 2017-07-23 22.30.30


▼USB-C充電線和電源轉接器本體是連在一起的,長度有1.5公尺,本身可以捲起來收納在電源轉接器上,還滿方便的。另外還有一條電源線,長度也有1.5公尺。

螢幕截圖 2017-07-23 22.30.51


▼量一下重量,電源轉接器161公克(下圖就是USB-C充電線捲起來收納在電源轉接器的情況)。

螢幕截圖 2017-07-23 22.39.23


▼電源線重89公克。

螢幕截圖 2017-07-23 22.39.03


▼合計249公克。

螢幕截圖 2017-07-23 22.39.40


▼從PChome抓下來的產品規格,在重量上只寫了本體重162公克,也沒把電源線重量標示出來。雖然有註明「本體」,但買了之後才確定本體並不包含電源線。感覺至少應該把產品總重量也一起標示出來比較合理一點。

螢幕截圖 2017-07-23 22.43.41


▼Innergie PowerGear 45瓦的USB-C充電線和電源線加起來長度有3公尺,大部分的情況應該不需要後面這條電源線。Apple原廠白豆腐(電源轉接器)有附一個小頭,可以拔起來使用。但因為原廠電源轉接器還是需要使用,所以Teddy就另外在PChome上面再多買一個小頭,價錢大約在250元左右。

螢幕截圖 2017-07-23 22.55.43螢幕截圖 2017-07-23 22.56.41


▼小頭重量13公克,加上電源轉接器本體重量162公克等於175公克。

螢幕截圖 2017-07-23 23.00.04


因為Apple原廠的87瓦電源轉接器放在公司沒有帶回家,所以沒幫法幫它量重量,網路上找到的資料上面寫的重量是362公克。如果不帶電源線出門,Innergie PowerGear 45瓦的重量比Apple原廠的87瓦電源轉接器要輕187公克

***

要真的能充電啊

▼重量輕187公克雖然很不錯,但重點還是要能夠對Macbook Pro 15吋Late 2016 充電。今天(7/23)剛好要去泰迪軟體上「Design Patterns這樣學就會了:進階實作班」,就把Innergie PowerGear 45瓦帶去用看看。


▼接著Macbook Pro。

螢幕截圖 2017-07-23 23.06.52


▼早上9:30開始上課,這時候Macbook Pro的電源是100%,用到11:42的時候還是100%。

螢幕截圖 2017-07-23 11.42.41


▼中午12:00吃飯的時候Teddy把充電器拔掉,邊吃飯邊用筆電,到了13:00的時候電源剩下83%。

螢幕截圖 2017-07-23 13.00.03


▼13:00開始上課,又接上充電器開始充電,到了13:35電量回升到91%。

螢幕截圖 2017-07-23 13.35.19


▼13:43回升到93%。

螢幕截圖 2017-07-23 13.43.39


▼後來一忙沒注意,到了15:28電量已經是100%。

螢幕截圖 2017-07-23 15.28.00


▼16:22快下課的時候電量還是維持在100%。

螢幕截圖 2017-07-23 16.22.24


Teddy使用的情境是在Parallels 12開PowerPoint,同時開啟Eclipse、Chrome(約50個分頁)、Safari。

▼筆電透過Apple原廠Type-C轉VAG轉接器接到投影機,Innergie PowerGear 45瓦電源轉接器就是接在這個轉接器上,透過它對筆電充電。

螢幕截圖 2017-07-23 23.20.34

***

使用心得

今天一整天七個小時使用下來對Innergie PowerGear 45瓦電源轉接器很滿意,優點有:

  • 體積小。
  • 重量輕。
  • USB-C充電線方便收納。
  • 在Teddy平常上課使用筆電的情境下,可以讓筆電保持100%充電狀況。在電力降到83%之後繼續充電也可以在持續使用電腦的情況下充到100%。
  • 價錢合理。

Teddy平常外出使用筆電的情境,也許不會使用過於耗電的應用程式,所以只要攜帶Innergie PowerGear 45瓦電源轉接器應該可以應付一整天的使用,算是找到一個不錯的原廠87瓦電源轉接器的外出替代方案。

***

友藏內心獨白:用低瓦數電源轉接器真的沒問題嗎XD。

2017年7月23日 星期日

2016吉隆坡、馬六甲、新加坡考察之旅Day8-C克拉碼頭周遭

June 13 17:16~17:51

▼逛到有點累了想回旅館休息一下,路上看到一家冰店進去吃個雪花冰消消暑。

Screenshot - 2017_7_13 , 下午 3_54_55

Screenshot - 2017_7_13 , 下午 3_54_45Screenshot - 2017_7_13 , 下午 3_55_02


▼再繞到林志源買點肉乾回去吃。

Screenshot - 2017_7_13 , 下午 3_55_10


▼路上看到一棟很有特色的建築物。

Screenshot - 2017_7_13 , 下午 3_55_27

***

▼下午六點前往克拉碼頭散步,沿途兩旁有高樓大廈、沿河路邊座位,想必晚上必定非常熱鬧。

Screenshot - 2017_7_13 , 下午 4_07_27Screenshot - 2017_7_13 , 下午 4_08_39

Screenshot - 2017_7_13 , 下午 4_06_59Screenshot - 2017_7_13 , 下午 4_07_08Screenshot - 2017_7_13 , 下午 4_07_32Screenshot - 2017_7_13 , 下午 4_07_37Screenshot - 2017_7_13 , 下午 4_07_52Screenshot - 2017_7_13 , 下午 4_07_55Screenshot - 2017_7_13 , 下午 4_08_22Screenshot - 2017_7_13 , 下午 4_08_31Screenshot - 2017_7_13 , 下午 4_08_54螢幕截圖 2017-07-13 16.08.10


▼終於近距離看到魚尾獅

Screenshot - 2017_7_13 , 下午 5_38_23

Screenshot - 2017_7_13 , 下午 5_37_36


▼熱門景點都是遊客。

Screenshot - 2017_7_13 , 下午 5_39_22

Screenshot - 2017_7_13 , 下午 5_39_37Screenshot - 2017_7_13 , 下午 5_39_55

螢幕截圖 2017-07-13 17.40.13螢幕截圖 2017-07-13 17.40.59



▼太陽下山之後的克拉碼頭,越夜越美麗。

Screenshot - 2017_7_13 , 下午 5_41_08Screenshot - 2017_7_13 , 下午 5_41_53

Screenshot - 2017_7_13 , 下午 5_41_50Screenshot - 2017_7_13 , 下午 5_41_58Screenshot - 2017_7_13 , 下午 5_42_04Screenshot - 2017_7_13 , 下午 5_42_08Screenshot - 2017_7_13 , 下午 5_42_15Screenshot - 2017_7_13 , 下午 5_42_22Screenshot - 2017_7_13 , 下午 5_42_26Screenshot - 2017_7_13 , 下午 5_42_33Screenshot - 2017_7_13 , 下午 5_42_38Screenshot - 2017_7_13 , 下午 5_42_44Screenshot - 2017_7_13 , 下午 5_43_04Screenshot - 2017_7_13 , 下午 5_43_07

***


▼回程在路上隨便找了間店吃飯,味道也還不錯。

Screenshot - 2017_7_13 , 下午 5_48_00Screenshot - 2017_7_13 , 下午 5_48_03Screenshot - 2017_7_13 , 下午 5_48_04


▼旅館有提供膠囊咖啡,加減喝。

Screenshot - 2017_7_13 , 下午 5_49_18

***

友藏內心獨白:忙碌的一天。