Duck Typing and Multiple Inheritance

255 views
172 views

Published on

Introduction to duck typing and Multiple Inheritance

Published in: Software, Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
255
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Introduction to Static and Dynamic Typing
  • 一個程式語言中的每個變數型別在編譯時期就完全決定好
  • 一個程式語言中的每個變數型別在編譯時期就完全決定好
  • TIOBE
  • John Backus 
  • John Backus 
  • Duck Typing and Multiple Inheritance

    1. 1. 多重繼承和Duck Typing 2014/06/19 Sway Wang
    2. 2. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    3. 3. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    4. 4. Static Typing • 程式語言中的每個變數型別在編譯時期就完全決定好 • 變數使用前需要宣告 • 編譯時期去做型別檢查 • C • C++ • Java • C# • Go • Swift
    5. 5. Dynamic Typing • 不需要事先宣告變數就能直接使用 • 程式實際執行時才做型別檢查 • Python • Ruby • Perl • PHP • JavaScript
    6. 6. TIOBE Index for June 2014
    7. 7. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    8. 8. 什麼是型別 • 從硬體角度來看,電腦只能處理二進位 • 控制CPU的組合語言處理資料只有數字 • 如何表示字串? • 為每個字元指定代號,當成一連串的整數 來處理
    9. 9. ASCII Table
    10. 10. 型別的誕生 • 必須記住所有數字資料代表的意義 • 對程式設計師負擔太重 • 1954年IBM開發出Fortran,建立型別的概 念
    11. 11. Fortran • IBM工程師John Backus開發的世界上第一 個高階程式語言 • 提出時遭到IBM顧問John von Neumann 反對 • Why would you want more than machine language? • 建立整數、浮點數、陣列等型態
    12. 12. Lisp • John McCarthy在1958年開發 • 用來處理人工智慧 • 世界上第二個高階程式語言 • 第一個函式語言(Functional Language) • 只有兩種資料型態:list, atom • Dynamic Typing的始祖
    13. 13. Simula • 1967由Norwegian Computing Center所開發 •第一個物件導向程式語言 •提出Object, Class, Inheritance, virtual method •Ref Type : 可指向任何物件 •影響C++和Smalltalk(世界上第二個物件導向語言)
    14. 14. Smalltalk • Xerox PARC在1972所發表 • 繼承Simula物件導向的概念 • 和Lisp一樣採用動態型別 • 在C++誕生前最主要的物件導向程式語言 • 影響MVC, GUI以及許多物件導向程式語言
    15. 15. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    16. 16. 單一繼承的問題 • 許多程式語言只支援單一繼承 – Smalltalk, Java, C# • 現實世界中一個人可能同時是公司員工也 是父親 • 單一繼承造成某些函式庫的設計上不太自 然
    17. 17. 多重繼承的解決辦法
    18. 18. 多重繼承的問題 • 結構複雜化 • 繼承的優先順序 • 相同名稱的衝突 The diamond problem
    19. 19. 多重繼承和goto敘述類似 • 結構化程式解決goto問題時改為使用if和 loop • 多重繼承應改為使用受限的多重繼承 • Java, C#的interface以及Ruby的mix-in
    20. 20. C#的解法 • 繼承實做 => 指定父類別 • 繼承規格 => implement指定interface • 只能繼承一個父類別 • 可繼承多個interface • 無法繼承多個實做
    21. 21. Interface的缺點 • 無法共享實做內容 • 違反DRY (Don’t Repeat Yourself) • 必須改用合成 (Composite)
    22. 22. 其他語言的解法 • Ruby Mix-in(Module) – Mix-in類似Interface – 無法單獨建立實體 – 不繼承自一般類別
    23. 23. 其他語言的解法 • Python允許多重繼承 – 用C3 Algorithm算出Method Resolution Order – 確保子類別修改過得函式順序一定優先於父類 別
    24. 24. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    25. 25. Duck Typing • Dynamic Typing的其中一個好處是不用宣 告型別 • 比較容易處理開發前沒有設想過的資料 • If it looks like a duck, swims like a duck, and quacks like a duck, then it must be a duck.
    26. 26. Duck Typing Example
    27. 27. Message Log 輸出的對象要改為字串該怎麼辦? 1. 複製 log()函式改寫成輸出到字串的版本 2. 輸出到檔案再讀回來
    28. 28. Message Log(Duck Typing) • Python中的StringIO有 File Object所有的methods • C#要做到類似的事情相當麻煩
    29. 29. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    30. 30. 泡咖啡
    31. 31. 泡茶
    32. 32. 第一版的設計
    33. 33. 還是有類似的部份
    34. 34. 修改Base class
    35. 35. 第二版的設計
    36. 36. Template Method Pattern • 把演算法的步驟定義在一個函式中 • 由子類別重新定義一個或多個步驟
    37. 37. 動態語言實做Design Pattern • 大多數情況實做起來較簡潔且彈性大 • 不需要為了滿足型別而使用繼承
    38. 38. Ruby Enumerable • 一個Library (Module)提供以下這些函式
    39. 39. Ruby Example • Template Method的變形,不使用繼承
    40. 40. 其他特性
    41. 41. First-Class Function Nested Function
    42. 42. Closure(閉包)
    43. 43. Outline • 簡介Static Typing以及Dynamic Typing • 程式語言發展歷史 • 多重繼承 • Duck Typing • Template Method Pattern • 結論
    44. 44. Static Typing的缺點 • 一定要指定型別 – 有時只為了單純滿足編譯器 • 較為缺乏彈性
    45. 45. Dynamic Typing的缺點 • 編譯時不檢查型別,執行時才檢查錯誤 – 撰寫完整的單元測試來彌補 • 閱讀程式碼時資訊較少 – 靠文件來補齊 – 撰寫簡潔程式碼 • 執行速度較慢 – 現在的電腦在大部分應用上,效能都不是問題 – 程式的彈性和生產力比效能來的重要
    46. 46. Q & A • Thanks for your listening!!

    ×