也谈为什么面向对象很糟糕

其实我的编程之路应该是自学的:二十年前中学时上过一次微机课,大家照着课本用BASIC播放了音乐,然后编程的神奇勾起了我少年的好奇。后来微机课基本没上了,自己去新华书店买了一本PASCAL编程的书籍,因为没有电脑,这本书放在我的枕边,始终不得入门。但到高中时,神奇的事情发生了:某天突然无聊又捧起这本书看,看着看着我突然发现我看懂了,而且学会了编程。事情就是这么神奇:我是通过PASCAL学会的编程,但我始终没用过PASCAL,即便是后来的DEPHI。

回忆少年时学习编程时,记得那本PASCAL编程书的开篇第一句话就是:程序 = 数据 + 算法。

我想这个公式即便是放在现在也是对的。“程序”就像是一个人在思考一个问题:把问题记忆在大脑的细胞里(和数据存储如出一辙),通过我们大脑神经网络(算法)思考问题,然后得出一个结果、答案。也像是解一道数学题:输入初始数据,通过一系列公式定理得出一个答案。

后来大学考上了软件工程专业,学习了软件工程,才知道“程序 = 数据 + 算法”只是一个开始。软件涉及的东西很多,不仅仅只是跟计算机打交道。大学期学习的语言很多:C 、C++、JAVA,C++是作为《面向对象》这门课程来教授的。但面向对象在大学期间始终不得入门,因为同学期还有学习JAVA这门课程。后来又接触了MFC,更加混乱。

但大学毕业后,初始从事了一段时间网站开发,用的是 javascript、vbscript、html、css、数据库。后来又从事智能家居的研发,那时开始接触Qt,因此我的面向对象的思想是从QT这个图形GUI库学习来的。我自认为还是比较纯正的,因为面向对象是最适合HMI和游戏的。因此我从不排斥面向对象编程,但我为什么也要说面向对象是糟糕的。

工作后接触的项目多了(工作主要的语言是C/C++),发现很多灾难性的软件项目和后期维护都是面向对象造成的。因此我非常赞成Joe Armstrong这位先辈的观点的:面向对象的糟糕并不是指面向对象语言,而是源于面向对象思想的滥用。

软件的本质就是硬件的衍生:正如计算机的历史,通用计算机的发明是建立在专用计算器的基础上,程序是为了让通用计算机能够工作而存在的。因此软件的可变性是从她诞生之初就存在的,只要是软件还在运行就不能排斥人们想要修改它的欲望。

我们还是回归到编程语言的本质:是对计算机寄存器进行操作和逻辑运算等指令的集合,从而告诉计算机如何工作。因此即便没有编程语言,通过二进制纸带也能告诉计算机如何工作。因此编程语言的发明只是为了我们更加方便的告诉计算机如何工作,汇编语言,C语言,JAVA等等更高级的语言,也是为了让我们软件开发更加便利。面向对象只是一种思想和编程范式,即便没有面向对象语言,难道就能阻止你使用面向对象的思想编程吗?

回答是否定的。但纯面向对象语言造成了什么情况呢?人们误以为面向对象语言是解决软件危机的“银弹”,但事实上不是,而且大多数情况下是灾难。为什么这样说呢?

1. 一个初学者如果刚接触的语言就是纯粹的面向对象语言,他会去深究面向对象语言身后的面向对象的深刻思想吗?他只是拿来用而且,而且万物皆为对象,他不会马上理解到对象抽象的不适宜可能会后来工作造成的不良及灾难性后果。

2. 即便是一个资深的工程师,也不见得能很好得抽象万物,这是一个思维的问题:对同一事物的理解,一万个人有一万个想法。因此这会造成后期的维护者不能很好得理解前任开发人员的抽象思维,维护成本是巨大的。

3. 大多数时候,我们只是想用编程解决的具体问题可能不需要万物皆对象,为什么面向对象语言还是让我用面向对象的思想来思考解决问题? 譬如,可能这个问题我只需要写一个几十行和上百行代码的进程/任务就能解决,用面向对象语言就会强制你使用面向对象的思想进行事物抽象,从而写出一堆冗余的接口,但实现代码就那么几十行,编程的乐趣完全丧失了。假如你不使用面向对象的思想来使用面向对象语言,长期以往你可能就会养成一个坏的习惯。因此使用纯粹的面向对象的语言总是陷入两难之中。

4.最后一点可能会比较复杂和专业:就是任何纯粹的编程范式语言都会限制你在软件架构时的视野。因为从本源出发,一开始编程是没有任何限制,但人们在长期从事编程的工作中发现:必须对编程增加一些限制,以防止软件的可变性像脱缰的野马导致最后的失控。于是人们发明了各种编程范式,防止程序员开发出具有危险不安全无法维护的代码。但是从另一方面来说,增加限制也就意味丧失一定的自由度,自由一定是坏的吗?就像面向对象一定是坏的吗,一样的命题。没有绝对坏的事物,只看使用的人,过度自由和过度限制都会妨碍我们。所以我们在使用自由度比较大编程语言时,一定要时不时警惕自己,用编程范式和软件架构给自己上一道道枷锁。

to be continue...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值