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

Mais conteúdo relacionado

Semelhante a Duck Typing and Multiple Inheritance

Go for web
Go for webGo for web
Go for webWeng Wei
 
网站前端代码静态检查工具研究
网站前端代码静态检查工具研究网站前端代码静态检查工具研究
网站前端代码静态检查工具研究pop2008
 
为什么要学Python
为什么要学Python为什么要学Python
为什么要学PythonDepeng Cong
 
与Python一路走来
与Python一路走来与Python一路走来
与Python一路走来leejd
 
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享愛創小小聚201307 小強分享
愛創小小聚201307 小強分享iTrEnD
 
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型Justin Lin
 
构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网yang alex
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述pop2008
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)悦 温
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?Kirk Chen
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析國昭 張
 
[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204CAVEDU Education
 

Semelhante a Duck Typing and Multiple Inheritance (20)

Go for web
Go for webGo for web
Go for web
 
网站前端代码静态检查工具研究
网站前端代码静态检查工具研究网站前端代码静态检查工具研究
网站前端代码静态检查工具研究
 
为什么要学Python
为什么要学Python为什么要学Python
为什么要学Python
 
与Python一路走来
与Python一路走来与Python一路走来
与Python一路走来
 
Dpl in action
Dpl in actionDpl in action
Dpl in action
 
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
 
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
 
构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
Jasmine
JasmineJasmine
Jasmine
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
RSpec & TDD Tutorial
RSpec & TDD TutorialRSpec & TDD Tutorial
RSpec & TDD Tutorial
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析
 
[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204
 

Mais de Sway Wang

Design patterns and MV
Design patterns and MVDesign patterns and MV
Design patterns and MVSway Wang
 
How to select password(Chinese)
How to select password(Chinese)How to select password(Chinese)
How to select password(Chinese)Sway Wang
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to PythonSway Wang
 
Agile development
Agile developmentAgile development
Agile developmentSway Wang
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to PerlSway Wang
 

Mais de Sway Wang (9)

Refactoring
RefactoringRefactoring
Refactoring
 
MCU compare
MCU compareMCU compare
MCU compare
 
Solid
SolidSolid
Solid
 
Design patterns and MV
Design patterns and MVDesign patterns and MV
Design patterns and MV
 
How to select password(Chinese)
How to select password(Chinese)How to select password(Chinese)
How to select password(Chinese)
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to Python
 
Agile development
Agile developmentAgile development
Agile development
 
Libusb
LibusbLibusb
Libusb
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 

Duck Typing and Multiple Inheritance

Notas do Editor

  1. Introduction to Static and Dynamic Typing
  2. 一個程式語言中的每個變數型別在編譯時期就完全決定好
  3. 一個程式語言中的每個變數型別在編譯時期就完全決定好
  4. TIOBE
  5. John Backus 
  6. John Backus