您的位置:首页 > 编程语言

编程基础知识之编程哲学

2015-11-14 13:48 351 查看
计算机软件经历了数十年的发展,形成了多种学术流派,有面向过程编程、面向对象编程、函数式编程、面向消息编程等,这些思想究竟孰优孰劣,众说纷纭。
C语言是纯过程式的,这和它产生的历史背景有关。Java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数。而Go语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精。
从编程范式的角度来说,Go语言是变革派,而不是改良派。
对于C++、Java和C#等语言为代表的面向对象(OO)思想体系,Go语言总体来说持保守态度,有限吸收。
首先,Go语言反对函数和操作符重载(overload),而C++、Java和C#都允许出现同名函数或操作符,只要它们的参数列表不同。虽然重载解决了一小部分面向对象编程(OOP)的问题,但同样给这些语言带来了极大的负担。而Go语言有着完全不同的设计哲学,既然函数重载带来了负担,并且这个特性并不对解决任何问题有显著的价值,那么Go就不提供它。

次,Go语言支持类、类成员方法、类的组合,但反对继承,反对虚函数(virtual function)和虚函数重载。确切地说,Go也提供了继承,只不过是采用了组合的文法来提供:
type Foo struct {
Base
...
}
func (foo *Foo) Bar() {
...
}
再次,Go语言也放弃了构造函数(constructor)和析构函数(destructor)。由于Go语言中没有虚函数,也就没有vptr,支持构造函数和析构函数就没有太大的价值。本着“如果一个特性并不对解决任何问题有显著的价值,那么Go就不提供它”的原则,构造函数和析构函数就这样被Go语言的作者们干掉了。

在放弃了大量的OOP特性后,Go语言送上了一份非常棒的礼物:接口(interface)。你可能会说,除了C这么原始的语言外,还有什么语言没有接口呢?是的,多数语言都提供接口,但它们的接口都不同于Go语言的接口。
Go语言中的接口与其他语言最大的一点区别是它的非侵入性。在C++、Java和C#中,为了实现一个接口,你需要从该接口继承,具体代码如下:
class Foo implements IFoo { // Java文法
...
}
class Foo : public IFoo { // C++文法
...
}
IFoo* foo = new Foo;
在Go语言中,实现类的时候无需从接口派生,具体代码如下:

type Foo struct { // Go 文法
...
}
var foo IFoo = new(Foo)
只要Foo实现了接口IFoo要求的所有方法,就实现了该接口,可以进行赋值。
Go语言的非侵入式接口,看似只是做了很小的文法调整,实则影响深远。
其一,Go语言的标准库再也不需要绘制类库的继承树图。你只需要知道这个类实现了哪些方法,每个方法是啥含义就足够了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: