主题:庆祝Python跃居世界第四程序语言 -- 空格
首先,我反对的是在所有域中不受限制的隐式重载。从实用主义的角度出发,类成员函数的重载是可以接受的,因为类成员函数相对于C来说是新的,可以在上面附加其他的功能,而且,类成员函数明确定义在一个域中,无论是功能上还是在代码上它们都是聚集的,并且限制在某个范围内,所以重名也不会引发理解上的问题。但是,对一个global scope里面的函数,隐式的重载使得其编译出来的代码和传统的C不兼容,而且会引发理解上的困难。例如:
#include <foo2.h>
void foo(float bar) {}
foo(1);
请问这个foo调用的是哪一个函数? 看起来它应当就是离它最近的那个函数,这理应是最简单的行为,但是C++中,如果foo2.h中有另一个void foo(int),那么它会调用另一个函数。这要求程序员和IDE都要做全局的分析以后才能知晓。如果我们禁止隐式重载,让重命名foo函数变为错误,而引入一个关键字overload做显式重载,那么会怎么样呢:
#include <foo2.h>
void foo_f(float bar) {}
overload foo foo_i;
foo(1);
不动的部分保持了和C的兼容性,foo_f, foo_i都被直接地暴露到名字表中,使得我们可以去掉export关键字,而且增加的overload关键字在程序中显式地标识出重载表,考虑到它可以重复声明,因此可以在离调用最近的地方重声明来方便程序的理解。同理C++中的exception等都可以用类似的方法加入,而不需要修改整个语言。这样做的一个额外的好处就是如果程序员坚持老的方式,他不需要重新学习什么东西,不需要改变自己来适应语言的变化。
其次,我反对C++现在这样的运算符重载。我认为Python的运算符重载方式更为优越。对于一个类,除非用operator关键字声明,除非在C++中使用运算符,否则一个程序员无法用别的方式重新定义和使用这一功能。所以C++的书里面必须单独辟出一章来讲运算符重载。其实运算符重载只不过是成员函数重载的一种特殊形式。如果我们强制规定类的__exec__方法对应operator (),那么,程序员就不需要额外学习运算符重载,他可以持续地按普通成员函数的方式定义和使用__exec__。而且,对于非C++的语言,也可以通过调用__exec__方法来复用C++程序员的成果。
Boost.spirit这样的模板库,我还是那个看法,看起来很精致,很美,但是不实用。在缺乏编译过程的调试工具的现状下,使用复杂的模板库,其开发时间会远远超过使用非模板库。而且就算神的代码一次性正确又如何,编译时间都会使得基于它的代码缺乏竞争力。很多东西都不需要我们来批判它,它会自然地被时间淘汰的。
本帖一共被 1 帖 引用 (帖内工具实现)
- 相关回复 上下关系8
压缩 4 层
🙂说点不同意见 1 透明 字454 2011-03-07 23:51:22
🙂C++的重载可以做到这个吗 sunsol 字39 2011-03-12 02:06:44
🙂可以 透明 字642 2011-03-12 02:34:49
🙂我也并非完全反对重载
🙂你举的例子里之所以会产生混淆,与其说是因为 1 老石头 字534 2011-03-12 01:20:59
🙂语法是很末节的东西 1 午茶 字755 2011-03-07 13:23:28
🙂讨论一个特性的得失应当看它的机会收益 7 gcc296 字1570 2011-03-07 18:42:20
🙂你的思路在你的帖子里前后并不统一 1 老石头 字317 2011-03-12 01:41:47