2011年4月28日 星期四

13. Scala 與新的語言功能 --泛型 (Generic)

什麼是 Generic,讓我們舉最簡單的例子 Array 的排序。

關於排序的觀念很簡單,就是將 Array 的 element 依照由小到大或由大到小重新排列一次,這就是排序(sort),概念很清楚,但實做起來可是非常的麻煩。

在沒有泛型概念的時代,programmer 需要為各種型態寫出各個相對應的程式碼。

我們需要為整數些一個 sort_int 的 function,需要為浮點數寫一個 sort_float 的 function,需要為字串寫一個 sort_string 的 function,很累吧!
雖然這些 function 幾乎大同小異,但就是不能共同使用。寫這些 function 除了要 copy_paste 之外,最大的問題是,若你的 function 概念有點不對,有 bug 需要修改,那你可要展開你精明的頭腦,注意改對所有的 function,一個都不能漏掉,一個都不能改錯。

還有一個問題,如果你加了一個新的型態,比如複數 (complex number),那要記得把舊的 sort function 重新複製一份,否則你的 sort 是無法排序複數的。

很煩吧?多年以前 C++ 為了要改善這個問題因此加入了 template 的概念,也產生 STL (Standard Template Library) 供 programmer 使用。
Template 可以讓 programmer 寫出共同的部份程式碼,不需為了不同的資料型態重複寫類似的程式碼。

Java 當然後來也加入的這像特性,這種特性就叫 generic(泛型)。 Java 並大量使用泛型在它的共通資料結構中(如 HashMap、List、Se t等),你在使用 Java 當中應該使用過這些資料結構。

你的程式除了使用泛型的程式碼外,你也應該撰寫過一些泛型的程式碼,以工期他的程式呼叫。沒寫過?那你要多加油喔。

Scala 承繼 Java 的泛型觀念,並且把它擴充的更完整。Martin 可是 Java 泛型的開山始祖,在 Java 尚未有泛型之前,就設計過 Pizza Language 與 Generic Java 這兩個 Java 的泛型機制。Scala 引進型態參數 (Type Parameter) 的概念,讓泛型更嚴謹,更不容易寫出錯誤的程式碼,保障程式碼品質。

多了 Type Parameter 的概念,也就多了一道頭腦需要轉換,因此顯得更複雜,但這是需要付出的代價。

沒有留言:

張貼留言