最近几个月看了不少源码,作为一直主要使用C++的二代程序猿,在面向对象(OOP)的语言层面上感觉到了一些困惑。
我所看的Linux上的几个优秀开源项目代码几乎都是C语言写成,才知道原来并不是任何操作都需要由一个对象完成。没有模板,没有继承,取而代之的是短小精悍的函数式Routine,结构体加上这些函数也可以很优雅地完成许多功能。一种功能在不同开源项目中都有各自的实现,或许最合适自身项目的实现才是最好的功能实现。除了性能上的考虑,我只能想到这种解释了。
为什么不用C++,不用OOP?
可能这个问题不准确,结构体的实例也可以称之为“对象”,不过我的意思是为什么不用OOP的一些思想?比如多态,泛型。可能有一种答案是:“Linux根本不需要OOP”。或许是因为受到Scott Meyers的影响,在考虑一个问题时,我总会第一个想到是什么,完成什么功能,最容易阅读和简练的表达应该是怎样?然后再反过来想如何用C++的各种特性优雅地实现它。
比如,一个简单的TCPServer,我只想要:
1 | TCPServer server; |
当然,还要有C++程序猿都必须考虑的问题,实际代码可能是这样:
1 | try{ |
这样不也是很容易理解么?但是如果用C来表达,可能就完全是相反的思维过程了。
面向过程的编程风格要求你要一步步把一大堆扎堆式的代码摆上台面,初始化套接字,绑定端口,监听,循环……,给人的感觉如果要实现某样功能,就必须按照这个套路出牌,程序结构上没有太多美感,我是这么认为的。因为我觉得C代码的可阅读性远不如C++,而C++代码的可阅读性又远不如那些动态语言。有朋友说C++这门语言用的人会往精英化方向发展,的确,不过还有一种可能性是选择向新的技术(语言)靠拢。
《黑客与画家》中认为编程语言的发展过程是这样的,可阅读性越来越高,越来越能被普通人理解。我也赞同这样的想法。这进化的背后是思想在进行怎样的变化?我不排斥这样的进化,因为我知道自身处在这样的大技术革命浪潮中,任何时候都要准备好接触新事物,但是我认为很重要的一点是要明白技术的历史,去理解为什么要这样进化,进化的主干版本在哪里。
嗯,吐槽就这些~
PS.有一点我可以非常肯定的是:编程语言总是程序员们热爱讨论的问题。