iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

入坑 RoR 必讀 - Ruby 物件導向設計實踐系列 第 11

Day11 CH6 使用鴨子類型技巧降低成本(下)

  • 分享至 

  • xImage
  •  

什麼是型別(Type)

在程式語言中,type(類型)指的是變數或數據的分類或分類方式,它確定了數據的性質,包括它可以執行的操作,佔用的記憶體空間,以及對該數據可以進行的操作。

  1. 基本類型(Primitive Types):基本數據類型,如整數(integer)浮點數(float)字元(char)等。它們通常具有固定的大小和操作。
  2. 自定義類型(Custom Types):顧名思義,通常由設計師通過類別(class)struct來實現。自定義類型可以具有自己的變數和方法。
  3. 複合類型(Composite Types):複合類型是由其他類型組成的類型。例如,字串(array)是由相同類型的元素組成的,struct包含了多個不同類型的成員。
  4. 靜態類型(Static Types):變數的類型要事先聲明,且在聲明時就確定了,不能改變。這樣可以在編譯(compile)時檢測類型錯誤,提高代碼的穩定性和性能,例如:JavaC++
  5. 動態類型(Dynamic Types):變數的類型在運行時可以改變。這意味著一個變數可以在不同的時間包含不同類型的數據,例如:JavaScript,PythonRuby

靜態類型 VS 動態類型

靜態類型特點 動態類型特點
編譯器可在編譯(compile)時發現類型錯誤。 程式碼是直譯(interpret)的,可以動態載入,沒有「編譯/建置」週期,應用程式的整體開發速度會更快。
可見的類型資訊可作為文件記錄,程式設計師無法以其他方式來理解這段程式碼,他們無法根據物件的上下文推斷出它的類型。 原始碼不包括明確的類型資訊,不包含類型宣告的程式碼會更容易被理解,程式設計師可以根據上文推斷出
物件的類型編譯(compile)後的程式碼是經過最佳化的,可以跑得更快。 靈活度高,更容易實作元程式設計(Metaprogramming)

擁抱動態型別

  1. 元程式設計(Metaprogramming)

Metaprogramming is a programming technique in which computer programs have the
ability to treat other programs as their data. It means that a program can be
designed to read, generate, analyze or transform other programs, and even modify
itself while running.

  • 元程式設計是指撰寫能夠生成或操作程式碼的程式碼,並且在執行時完成部分本應在編譯時完成的工作。它可以是強大的工具,但也需要謹慎使用。

  • 元程式設計雖可以提高程式設計效率,但也可能讓程式碼變得晦澀難懂。

    (詳細的說明可能就要自成一個主題辣(暈),有興趣瞭解與Ruby相關的元程式設計可以自行去閱讀《Metaprogramming Ruby 2》。)

  1. 動態類型的優勢
  • 動態類型語言具有靈活性,不需要冗長的類型宣告。
  • 動態類型可以提高程式設計效率,減少開發時間,並降低學習曲線。
  1. 編譯器無法防止所有類型錯誤
  • 雖然靜態類型可以防止某些類型錯誤,但並不能完全防止執行時的錯誤。
  • 動態類型要小心處理變數初始化和訊息傳遞,但這些錯誤在兩種類型系統中都可能發生。
  1. 鴨子類型 (Duck Typing)
  • 鴨子類型是建立在動態類型之上的概念,強調物件的 行為 而不是類型。
  • 使用鴨子類型時,我們信任物件是否能夠正確執行特定的行為,而不需要關心其具體類型。

結論

請記住,訊息是物件導向應用程式的核心,它們會在物件之間藉由公共介面傳遞。鴨子類型能將公共介面從特定類別分別出來,並建立出 「做什麼,而非是什麼」 的虛擬類別。

此外,鴨子類型能揭露出隱藏的底層抽象,好處在於依賴於抽象能夠降低風險並增加靈活性,使應用程式的維護成本更低,且更易於修改。

參考資料:


上一篇
Day10 CH5 使用鴨子類型技巧降低成本(上)
下一篇
Day12 CH6 藉由繼承取得行為(上)
系列文
入坑 RoR 必讀 - Ruby 物件導向設計實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言