ch 2-5 Duck Typing
duck typing 實在很常聽到,尤其自己常寫的是 Python XD
在講到 type 時,常聽到的有 static 和 dynamic,static 的話不用執行就可以知道, dynamic 的話要執行下去才能確認
硬體看得懂的是二進位數字,其他寫程式用到的型別都是建立在這之上的, 如果沒有做成更好用的 type 的話會造成程式撰寫上的負擔, 於是 Fortran 提供了型別 (整數資料、浮點數陣列等等), 於是有了 static type (宣告型別)
Lisp & Dynamic type
在 Fortran 出現後幾年,出現了 Lisp, 1958 年的 Lisp 只有兩種型別 : list、atom,不是 list 的都是 atom
cons cell
car, cdr
S-expression
Lisp 的 list 裡事先無法知道 cons cell 裡面指到的是 cons cell 還是 atom, 本質上可說是 polymorphism 的 data structure, 所以 Lisp 採用的是 “資料本身還有描述自己型別的資訊”,又稱為動態型別
cons cell
+-----+-----+
| car | cdr |
+-----+-----+
| |
| |
+---+ +-----+-----+
| 5 | | car | cdr |
+---+ +-----+-----+
atom | |
| |
+----+ nil
| 13 | atom
+----+
atom
Static Type 起自 Fortran、Dynamic Type 起自 Lisp, 在最初的物件導向語言 Simula 裡,出現了和 Dynamic Type 類似的型別 Ref (Simula 中除了物件之外都是靜態型別), 之後從 Simula 的物件導向概念延生出的 Smalltalk 和 Lisp 一樣全面採用動態型別, 1980 年代前半,受到 Simula 影響而誕生了 C++,重要概念 : “subclass 可以視為 base class 的 instance”
Duck Typing 的概念是: “走路像鴨子,看起來像鴨子,那就可以把他當成鴨子”
Dynamic Type 裡避免名去檢查型別,而改以檢查是否有某 method