冒号和他的学生们(连载9)——泛型范式

泛型范式

算法是脊,数据是肉;思想是鸡,结论是蛋        ——题记

冒号重新开讲:“你们会不会经常遇到这种情景:一遍又一遍地写着相似的代码,有心将其归并,却因种种原因无法践行。”

逗号心有戚戚焉道:“是啊,有时明明两个函数的实现几乎一模一样的,就因为某些参数不匹配,无法合而为一。”

“有一种编程范式可以解决这个问题,它打破了不同数据结构之间的壁垒,让你的代码不再臃肿,这——就是泛型编程。”冒号的语调和说辞不免令人联想到电视上的减肥广告,“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.每从标准输入读取一个非数字的字符,于标准输出打印‘请输入数字’

时间: 2025-01-19 15:39:23

冒号和他的学生们(连载9)——泛型范式的相关文章

冒号和他的学生们(连载10)——超级范式

超级范式 智能繁衍:机器人生产机器人 --题记 引号忽然想起一事,问道:"有一本名为<C++模版元编程>的书,既然提到了模板,想来也属于泛型编程吧?" 冒号答道:"模板元编程即Template Metaprogramming,与GP密切相关但自成一派,隶属于另一种编程范式--元编程(Metaprogramming),简称MP.这里的前缀'meta-'常译作'元',其实就是'超级'.'行而上'的意思.比如,元数据(Metadata)是关于数据的数据,元对象(Meta

冒号和他的学生们程序员提高班纪事系列

冒号和他的学生们(连载27)--接口服务 冒号和他的学生们(连载26)--访问控制 冒号和他的学生们(连载25)--软件应变 冒号和他的学生们(连载24)--对象封装 冒号和他的学生们(连载23)--数据抽象 冒号和他的学生们(连载22)--抽象思维 冒号和他的学生们(连载21)--后台脚本 冒号和他的学生们(连载20)--前台语言 冒号和他的学生们(连载19)--平台语言 冒号和他的学生们(连载18)--系统语言 冒号和他的学生们(连载17)--语言讨论 冒号和他的学生们(连载16)--动态语

冒号课堂§3.1:泛型范式

第三课 常用范式(1) 课前导读 这一课介绍了四个常用的编程范式:泛型式.元编程.切面式和事件驱动式. 本课共分四节-- 1.泛型范式 2.超级范式 3.切面范式 4.事件驱动 3.1泛型范式--抽象你的算法 以类行杂,以一行万 --<荀子•王制篇> 关键词:编程范式,泛型编程,STL,算法 摘要:泛型式编程简谈 ?提问 泛型编程有哪些优点? STL有哪些要素?各自有什么作用? 泛型编程的泛化对象是什么? 泛型编程的核心思想是什么? :讲解 冒号重新开讲:"你们会不会经常遇到这样的情

冒号和他的学生们(连载1)——开班发言

开班发言 授人以鱼不如授人以渔 --古语 冒号开了个程序员提高班,今天迎来了首期学员,他们是问号.句号.逗号.引号和叹号,皆为IT业的新兵.望着台下洋溢着青春与渴望的脸庞,冒号开始了他的开班发言-- 大家好!先自我介绍一下,本人姓冒名号字解之.诸位不必叫我老师,就叫老冒好了.比在座各位痴长几岁,"老"是担得的,"师"却不敢妄言.在下编程多年,自觉小有所成,不敢专藏,特开此班与众共享.虽系一家之言.一孔之见,若能抛砖引玉,又何惧方家之哂?疏谬之处,还望海涵斧正,不致自

冒号和他的学生们(连载2)——首轮提问

首轮提问 敬畏老师莫如敬畏真理 --题记 众人面面相觑,一阵沉默后开始窃窃私语,显然有些不太习惯这种教学方式--笔记本上还没写两个字呢,老师就把球给踢回来了. 冒号也不说话,只是微笑地望着大家. 还是问号打破僵局,开始发问:"老师--" 冒号扬手打断他:"这里没有老师,唯一的老师是你自己.本班的一个特色是:师生角色模糊,大家自主学习,相互启发,教学相长." 问号顿了顿:"老冒--"全班哄堂大笑,"学软件开发,当然得先学语言,计算机语言这

冒号和他的学生们(连载27)——接口服务

27.接口服务 律己宜严,待人宜宽 --<洪应明·菜根谭> 叹号幡然反省:"以前我们做OOP编程时,总是专注于如何利用其他类来解决问题,而较少考虑自己设计的类对其他类的影响." 引号翻开以前的笔记:"前面提过,OOP的世界是民主制的,所有对象都是独立而平等的公民,有权利寻求服务,也有义务提供服务.看来我们是光惦着权利而忘了义务了." 冒号继而提出:"作为服务的提供者,最重要的是讲诚信.首先,服务要有可靠性,不能阳奉阴违--即接口必须履行它的承诺

冒号和他的学生们(连载26)——访问控制

26.访问控制 夫轻诺必寡信,多易必多难 --<老子·德经> 问号提问:"信息隐藏是否专指用private来控制访问?" "这正是我们的下一个焦点."冒号微颔,"访问修饰符(access modifier)除了可以应用于类成员外,在Java和C#中还能应用于整个类.public类自然是公开的,而缺省的类在Java 和C#中分别仅对同一package和assembly开放." 逗号不觉有异:"这有什么讲究吗?" &q

冒号和他的学生们(连载25)——软件应变

25.软件应变 潜其心能观天下之理,定其心能应天下之变 --<吕坤·呻吟语> 第七课刚一开堂,冒号就提了一个问题:"如果把一个Java程序中所有的private关键字换成public,请问该程序还能工作吗?" "应该还能工作,除非--此前不能工作."问号小心翼翼地回答. 冒号接着问:"既然如此,何必费事区分它们呢?" 叹号嘴一撇:"当然是为了信息隐藏啰." 冒号步步紧逼:"隐藏什么信息呢?又为什么要隐藏?

冒号和他的学生们(连载24)——对象封装

24.对象封装 阴阳地理两分张,隐者为阴显者阳 --<玉髓经.曜星论> "用广东话说,真是有型有料又有性格啊!"叹号啧啧连声,"这哪里是在设计软件,分明是在设计心仪的对象嘛." "我们可不就是在谈对象设计吗?"冒号笑着反问,"在OOP的世界里,每位程序员都是造物主.保持热情.专注力和审美情趣,说不定哪一天就像希腊神话里的皮格玛利翁一样,雕塑的美女变活了." "哇,那可就美了!"逗号极尽夸张之调.