据说软件设计的最高境界是“面对这个设计,你不能再减少什么。”,也就是如爱因斯坦所说“As simple as possible, but not simpler”。
Java和C#就是2种打着简化C++语言设计大旗的两种语言,但是它们显然离上述“减之一分则太少”的设计美学标准还差得远。
比如说,这两天我就对这2种语言中的new关键字看得不顺眼,因为它完全是一个不必要的冗余设计。
先从C++说起,假设我们定义了一个class Foo,那么按照下面两个不同的语句定义的变量是完全不同的:
Foo bar=Foo(); |
或
Foo bar=new Foo(); |
其不同就在于前者bar的存储空间是栈,而后者bar的存储空间是自由堆。前者的析构由编译器自动完成,而后者析构需要程序员显式用delete完成。在C++中,new和delete总是成对出现是一个基本的常识。
到了java和C#的世界里,关于存储管理有两件大事发生了:1,除了primitive type之外的所有类型变量都在堆中分配;2,自动垃圾收集代替了程序员手工delete。后者打破了C++中的new和delete对称,即使从美学的角度看也是遗憾的事情。
更重要的是,从实用角度看在java和C#中new本来也是可以废弃的!这是因为既然没有了栈变量,那么
Foo bar=Foo(); 和 Foo bar=new Foo();
就可以表达完全相同的含义而不会带来疑义。你说什么?“可能和原生类型混淆”?别扯了,Java和C#的编译器会弱智到用new来区分原生类型和class类型吗?
关于我这个说法的一个佐证就是,同样作为没有栈变量并采用自动垃圾收集的语言,Python就不需要new关键字。相信我,Python没有因为这个原因而完蛋!:)