冒号课堂§3.1:泛型范式 - 编程入门网
冒号课堂§3.1:泛型范式时间:2011-06-25 BlogJava xyz98第三课 常用范式(1) 课前导读 这一课介绍了四个常用的编程范式:泛型式、元编程、切面式和事件驱动式。 本课共分四节—— 1.泛型范式 2.超级范式 3.切面范式 4.事件驱动 3.1泛型范式——抽象你的算法 以类行杂,以一行万 ——《荀子•王制篇》 关键词:编程范式,泛型编程,STL,算法 摘要:泛型式编程简谈 ?提问 泛型编程有哪些优点? STL有哪些要素?各自有什么作用? 泛型编程的泛化对象是什么? 泛型编程的核心思想是什么? :讲解 冒号重新开讲:“你们会不会经常遇到这样的情景:一遍又一遍地写着相似的代码,有心将其归并,却因种种原因无法践行。” 逗号心有戚戚焉道:“是啊,有时明明两个函数的实现几乎一模一样的,就因为某些参数不匹配,无法合而为一。” “有一种编程范式可以解决这个问题,它打破了不同数据结构之间的壁垒,让你的代码不再臃肿,这——就是泛型编程。”冒号的语调和说辞不免令人联想到电视上的减肥广告,“Generic Programming,简称GP,其基本思想是:将算法与其作用的数据结构分离,并将后者尽可能泛化,最大限度地实现算法重用。这种泛化是基于模板(template)的参数多态(parametric polymorphism),相比OOP基于继承的子类型多态(subtype polymorphism),不仅普适性更强,而且效率也更高。这不能不说是一种异数——我们知道,普适性往往是以效率为代价的。如果一定要找出代价的话,那就是其用法稍微复杂一些,可读性稍微差一些。GP最著名的代表是C++中的STL(Standard Template Library),其后亦为Java,C#等所吸纳。此外,一些函数式语言如Ocaml、Standard ML、Generic Haskell等也支持GP。” 冒号课堂§3.1:泛型范式(2)时间:2011-06-25 BlogJava xyz98冒号写下两段代码—— C++(泛型编程):
C(宏定义):
“求两个数中的较大值是经常遇到的问题。”冒号解说着,“对于静态类型语言[1]来说,若参数类型不同,即使函数体相同也不能合为一体。如果语言不支持重载(overload),还可能出现maxInt、maxLong、maxFloat、 maxDouble之类的函数名,冗赘而丑陋。尽管在C中可用宏定义来实现,但无法保证类型安全,而C++模板则兼顾类型安全和代码重用,并且由于是在编译期间展开的,效率上也不损失。不止于此,C++支持运算符重载,除数值类型外,一切定义了‘>’ 运算的数据类型均可调用max函数,真是一举N得,N趋向无穷大啊!” 冒号边说边比划,夸张的语气和手势逗得大家都笑了。 引号提出疑问:“Java的一切对象都是Object,将所有参数都换成Object类型,岂不也是一种泛化?” 冒号答道:“首先,基本类型如int,float等不是Object的子类,虽然Java 新增了自动装拆箱(autoboxing/unboxing)的功能,但要付出性能的代价。更重要的是,这将不可避免地需要类型的强制转换(explicit Conversion或cast),无法在编译期间施行严格的类型检查,由此丧失了静态类型语言的优势,为bug大开方便之门。这也是Java最终引入模板的原因,虽然有些姗姗来迟。类似地,C/C++中的通用指针void *也有类型安全问题。” 句号发表他的看法:“泛型虽好,似乎只是某些局部才用到的技术,不具有前面几种范式的渗透性。” 冒号听罢不语 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |