与杰之交谈-p2

鸭子类型

Posted by Keal on October 25, 2023

杰: 我今天吃到一个肉,感觉看起来是鸭肉,吃起来也是鸭肉,但是它叫鹅肉,这合理吗?

我: 你认真的问吗哈哈哈?我们程序开发里有个名词叫鸭子类型,大概意思就是如果一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子.

杰: 我就随便说说而已,没想到这种事情你们程序员也有研究.不过话说回来,哲学上来讲,一个物品叫什么确实跟他是什么没有关系,也许在我的文化里”鸭子”就是我吃起来这样的,而”鹅”则是吃起来是那样的,在另外的问话里,却反过来了.但鸭子和鹅本身并不会因为有人叫他鸭子,有人叫他鹅而发生变化.

我: 这么想的话名字也许只是为了方便大家沟通,建立起一个统一的语义,避免误解吧. 在你跟我之间,杰是你,但是我还有另外的一个也叫杰的朋友,虽然都是杰,但明显你们是不同的人.

杰: 哎, 也许我只是他不在时候的替身罢了. 可是说这么多, 我感觉受伤的是我, 花了鹅的价钱, 享受的是鸭的结果.unfair! it’s unfair!

我: 也许不用想太多,大家都是中国人, 你吃的应该是鹅肉, 只是你对鸭肉和鹅肉的认知还不够深, 而店家的处理方式又进一步掩盖了其中的差异, 导致你没办法分辨出来.

杰: 你安慰人还是有一套的,听你说完,还是我自己的问题了?算了,我刚听你说到鸭子类型,我有点兴趣,你不如再详细说说?

我: emm,事实上我对鸭子类型的认知也比较浅. 在程序中大概是这样一个情况: 如果定义会飞的是鸟, 那么任何只要会飞的就可以认为是鸟,而不用管他实际怎么样,即使他实际是个飞机,还可以载客,可以发射导弹,可以执行命令,但依然可以认为它是鸟. 简答来说, 比起关注你是什么, 我更关注你能做什么.

杰: 那这样的话岂不是实际情况有可能差很远,就像你说的,可以把飞机当成鸟,也可以把鸡当成鸟.

我: 是的, 这也是鸭子类型被诟病的地方, 虽然它非常灵活, 但对使用者的要求更高. 你必须比较清楚的知道自己在做什么. 或者利用大量的测试用例去保证他的可靠范围.

杰: 这么说来,你们没有完美的替代方案,也只能在灵活和安全方面取舍咯?

我: 是的.

杰: 你说的通过大量的测试用例去保证可靠范围, 听起来有点像是在弥补鸭子类型的安全问题, 但是这样的话不就与它灵活效率的优点背离了吗?编写大量测试用例所需要的时间应该也挺多吧?

我: 你说的很有道理. 但实际情况下, 许多公司并不会去编写大量测试用例. 我是说即使部分大公司,也是如此. 即使需要测试用例, 通常一开始都比较简单,覆盖的范围较少, 等到产品稳定之后再慢慢补充. 这样对于实际开发的效率不会有太大影响.

杰: 哦~原来如此. 那对我来说,看起来是鸭肉,吃起来也是鸭肉,那对我来说,它就是鸭肉嘛哈哈哈哈.

我: 看来你的确理解了.

杰: 看来当程序员也不是很难嘛, 可是为什么是鸭子类型, 不是小鸟类型, 蝴蝶类型, 偏偏是鸭子呢?

我: emm, 这也许是当初举例说明的人恰好用的是鸭子来举例吧.

杰: ok. 最后一个问题, 你会更喜欢鸭子类型吗?

我: 是到. 毕竟我是一个优秀的程序员哈哈, 我会在爱使用这个东西之前明确的知道这个东西的尽可能多的东西,从而控制其影响范围, 避免意外情况的发生.

杰: 我反而更喜欢稳定一点的你说的另外一种类型, 虽然既不够灵活,也不够安全,但是有一种中庸的美.

我: 那你还不错, 大部分静态类型语言都是如此,并且还很流行. 来转做程序员吧哈哈哈哈

杰: 开玩笑啦,我可不想秃头.

我: 又一个刻板印象.

杰: 你没发现你额头越来越宽了吗?

我: 啊?扯了吧你哈!