鴨子類型

程式設計中,鴨子類型(英語:Duck typing)是動態類型和某些靜態語言的一種對象推斷風格。

基本介紹

  • 中文名:鴨子類型
  • 外文名:Duck typing
  • 所屬領域程式設計
  • 類型:動態類型和某些靜態類型
來源與釋義,壞處或不足,

來源與釋義

這是程式設計中的一種類型推斷風格,這種風格適用於動態語言(比如PHP、Python、Ruby、Typescript、Perl、Objective-C、Lua、Julia、JavaScript、Java、Groovy、C#等)和某些靜態語言(比如Golang,一般來說,靜態類型語言在編譯時便已確定了變數的類型,但是Golang的實現是:在編譯時推斷變數的類型),支持"鴨子類型"的語言的解釋器/編譯器將會在解析(Parse)或編譯時,推斷對象的類型。
在鴨子類型中,關注的不是對象的類型本身,而是它是如何使用的。例如,在不使用鴨子類型的語言中,我們可以編寫一個函式,它接受一個類型為鴨的對象,並調用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個函式可以接受一個任意類型的對象,並調用它的走和叫方法。如果這些需要被調用的方法不存在,那么將引發一個運行時錯誤。任何擁有這樣的正確的走和叫方法的對象都可被函式接受的這種行為引出了以上表述,這種決定類型的方式因此得名。
鴨子類型通常得益於不測試方法和函式中參數的類型,而是依賴文檔、清晰的代碼和測試來確保正確使用。從靜態類型語言轉向動態類型語言的用戶通常試圖添加一些靜態的(在運行之前的)類型檢查,從而影響了鴨子類型的益處和可伸縮性,並約束了語言的動態特性。
Duck typing 這個概念來源於美國印第安納州的詩人詹姆斯·惠特科姆·萊利(James Whitcomb Riley,1849-1916)的詩句:
鴨子類型
" When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck."
中文:
“當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這隻鳥就可以被稱為鴨子。”
義大利軟體工程師、Python軟體基金會研究員Alex Martelli 於2000年左右在Python的郵件組中最早將這個概念引入了程式設計範疇中:
" In other words, don't check whether it IS-a duck: check whether it QUACKS-like-a duck, WALKS-like-a duck, etc, etc, depending on exactly what subset of duck-like behaviour you need to play your language-games with"
"鴨子類型"像多態一樣工作,但是沒有繼承。
“鴨子類型”的語言是這么推斷的:一隻鳥走起來像鴨子、游起泳來像鴨子、叫起來也像鴨子,那它就可以被當做鴨子。也就是說,它不關注對象的類型,而是關注對象具有的行為(方法)。

壞處或不足

"鴨子類型"沒有任何靜態檢查,如類型檢查、屬性檢查、方法簽名檢查等。
“鴨子類型”語言的程式可能會在運行時因為不具備某種特定的方法而拋出異常:如果一隻小狗(對象)想加入合唱團(以對象會不會嘎嘎嘎叫的方法為檢驗標準),也學鴨子那么嘎嘎嘎叫,好吧,它加入了,可是加入之後,卻不會像鴨子那樣走路,那么,遲早要出問題的。這個例子來自於《JavaScript設計模式與開發實踐》。
再舉個例子:一隻小老鼠被貓盯上了,情急之下,它學了狗叫,貓撤了之後,小老鼠的媽媽不無感嘆的對它說:看吧,我讓你學的這門兒外語多么重要啊。這雖然是個段子,但是,由於貓在思考時,使用了 "鴨子測試",它以為會叫的就是狗,會對自己產生威脅,所以撤退了,也正是因為這個錯誤的判斷,它誤失了一次進食機會。

相關詞條

熱門詞條

聯絡我們