冒號和他的學生們(連載9)——泛型範式

來源:互聯網
上載者:User

泛型範式

演算法是脊,資料是肉;思想是雞,結論是蛋        ——題記

冒號重新開講:“你們會不會經常遇到這種情景:一遍又一遍地寫著相似的代碼,有心將其歸併,卻因種種原因無法踐行。”

逗號心有戚戚焉道:“是啊,有時明明兩個函數的實現幾乎一模一樣的,就因為某些參數不匹配,無法合而為一。”

“有一種編程範式可以解決這個問題,它打破了不同資料結構之間的壁壘,讓你的代碼不再臃腫,這——就是泛型程式設計。”冒號的語調和說辭不免令人聯想到電視上的減肥廣告,“Generic Programming,簡稱GP,其基本思想是:將演算法與其作用的資料結構分離,並將後者儘可能泛化,最大限度地實現演算法重用。這種泛化是基於模板的多重參數變形(parametric polymorphism),相比OOP基於繼承的子類型多態(subtype polymorphism),不僅普適性更強,而且效率也更高。這不能不說是一種異數——我們知道,普適性往往是以效率為代價的。GP最著名的代表是C++中的STL,其後亦為Java,C#等所吸納。此外,一些函數式語言如Ocaml、Standard ML、Generic Haskell等也支援GP。”

冒號寫下兩段代碼——

C++(泛型程式設計):

template <typename T>
T max(T a, T b)    // 求出兩個數中的較大者
{
    return (a > b) ? a : b;
}

C(宏定義):

#define max(a,b) ((a) > (b) ? (a) : (b))

“求兩個數中的較大值是經常遇到的問題。”冒號解說著,“對於靜態類型語言來說,若參數類型不同,即使函數體相同也不能合為一體。如果語言不支援重載(overload),還可能出現maxInt、maxLong、maxFloat、 maxDouble之類的函數名,冗贅而醜陋。儘管在C中可用宏定義來實現,但無法保證型別安全,而C++模板則兼顧型別安全和代碼重用,並且由於是在編譯期間展開的,效率上也不損失。不止於此,C++支援運算子多載,除數實值型別外,一切定義了‘>’ 運算的資料類型均可調用max函數,真是一舉N得,N趨向無窮大啊!”

冒號邊說邊比劃,誇張的語氣和手勢逗得大家都笑了。

引號提出疑問:“Java的一切對象都是Object,將所有參數都換成Object類型,豈不也是一種泛化?”

冒號答道:“首先,基本類型如int,float等不是Object的子類,雖然Java 新增了自動裝拆箱(autoboxing/unboxing)的功能,但要付出效能的代價。更重要的是,這將不可避免地需要類型強制轉換,喪失了靜態類型語言的優勢,為Bug大開方便之門。這也是Java最終引入模板的原因,雖然有些姍姍來遲。類似地,C/C++中的通用指標void *也有型別安全問題。”

句號發表他的看法:“泛型雖好,似乎只是某些局部才用到的技術,不具有前面幾種範式的滲透性。”

冒號聽罷不語,返身在黑板上寫下幾道題——

1.從一個整數數組中隨機抽取十個數,對其中的素數求和

2.將一個無序整數集中所有的完全平方數換成其平方根

3.從學產生績表中,列出門門都及格且平均分在70分以上的學生名單

4.在一個著色二元樹中,將所有的紅色結點塗成藍色

5.將一個字串從倒數第三個字元開始反向拷貝到另一個字串中

6.每從標準輸入讀取一個非數位字元,於標準輸出列印‘請輸入數字’

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.