2017年7月30日 星期日

Duck Typing

最近在書上看到頗特別的東西,鴨子類型(duck-typing),雖然這個東西似乎已經很久了...哈

duck typing是動態類型語言的一種特性,這個概念是由James Whitcomb Riley所提出的鴨子測試而來的。

 "如果我看到一隻鳥,牠走起來像鴨子,游泳時像鴨子,叫起來也像鴨子,那麼我就認為牠是隻鴨子。"

duck-typing所關注的並不是class繼承了甚麼或者實現了甚麼介面,而是它可以做甚麼、怎麼去使用它


在C# 4.0開始提供dynamic可以支援動態類型的動態語言運行(DLR),以下是簡單的範例




但如果Client端需要呼叫這段勢必也需要採用dynamic,但基本上不可能這樣,所以可以透過Nuget套件(ImpromptuInterface)來轉成我要的鴨子。

到了這裡,我開始思考鴨子類型能帶來甚麼好處與壞處呢?

好處:
只能想到它在撰寫程式可以帶來很多彈性,只要你的符合有該有的方法或屬性就可以運行,不用繼承特定的class或是實作interface。

壞處:
1. 鴨子沒有實現該有的function(殘了...),傳進去肯定是錯誤連連,而且必須要運行時才能發現錯誤。
2. 你的class有些方法不適合,但卻被當成鴨子使用。

所以使用鴨子類型必須要做好一定的測試,而測試的時候絕不是以類型去做測試

不要檢查它是不是一隻鴨子,而是它有沒有像鴨子一樣的叫

不過我想,我自己在實務上應該是不太會用它吧XD