面向对象语言的缺点和问题

面向对象编程是一种计算机编程架构。面向对象编程的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。面向对象编程达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。

刚开始学习C++ 时,我们首先了解到的就是面向对象语言的四个基本特征:抽象、继承、封装、多态、以及一大堆面向对象语言的优点包括代码重用,权限控制,易扩展,开发效率高之类的。毫无疑问面向对象编程的出现使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,结果编程就更加富有人性化,但同时面向对象语言从诞生之日起就一直伴随着许多的缺陷。

1、运行速度慢

就 C++ 而言,由于面向更高的逻辑抽象层,使得 C++ 在实现的时候,不得不做出性能上面的牺牲,有时候甚至是致命的 ( 所有对象的属性都经过内置多重指针的间接引用是其性能损失的主要原因之一)。
在计算机速度飞速发展的今天,你可能会说,一丁点的性能牺牲没什么大不了。是的,从面向对象的角度,使的编程的结构更加清晰完整,数据更加独立和易于管理,性能的牺牲可以带来这么多的好处,没有理由不做稳赚的生意吧?
不过,在某些对速度要求极高特殊场合,例如你做的是电信的交换系统,每秒钟有超过百万的人同时进行电话交换,如果,每一个数据交换过程都是一个对象,那么总的性能损失将是天文数字!!
或者这个例子不够贴身,再举个例子吧。假如你受聘于一个游戏设计公司,老板希望做出来的游戏可以更多的兼顾到更多的电脑使用者,游戏每秒钟的运行的帧可以 更多,子弹和爆炸物可以更多、更华丽。那么,你会发现使用 C++ 会使你的程序变得笨拙,无法满足你的需求。

2、继承的代价庞大,增加了代码量

对于面向过程语言来说,编程时需要哪些变量和方法就只编写这些变量和方法,而对于面向对象语言来说,每次无论你要使用什么都要先写一个类,并且每一个类都要有独立的变量和方法,这样就会造成可能很简单的问题也要很多的类代码,为了解决这个缺点,继承便出现了,继承可以让类与类可以共享代码,获得代码的可重用性,一定程度上降低了代码量。但是,随着继承层次的增加,代码的复杂性会加速增长,随之而来的bug也会越来越难以发现。

3、对象与对象之间相互依赖,耦合性太高

由于面向对象语言中一切都是对象,我们必须使用一个对象去创建另外一个对象,才能使用其内部方法,这样就造成了这些对象之间相互依赖,为了消除这些依赖,我们可以把创建对象的代码全部集中到一个对象之中,其他的对象都通过调用该对象的方法来动态的获取所需要的对象,这也就是我们所说的工厂模式。进一步地,我们可以不使用工厂,而是编写一个插件,该插件可以把我们所需要的对象在运行时动态地“塞”给我们,这就是依赖注入,也就是控制反转。这个插件就相当于Spring IOC。

4、失去了灵活性

面向对象语言代码都很死板,继承也没有运行时动态,但是java的多态机制,其不同于面向过程语言的方法后期绑定,在运行时才能确定具体调用的是哪个方法一定程度上增加了其灵活性。面向对象语言一直提倡的组合大于继承的思想诞生了许许多多的设计模式,这些设计模式通过对组合和多态的奇妙运用大大的增加了面向对象语言的灵活性。

5、需要一定的软件支持环境

面向对象方法学把分析、设计和实现很自然地联系在一起了。虽然面向对象设计原则上不依赖于特定的实现环境,但是实现结果和实现成本却在很大程度上取决于实现环境。因此,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来说是非常重要的。
综上所述,其实在我们的学习过程中可以看到面向对象语言有许多优秀的地方,但也有一些缺陷,而我们一直都在努力地想尽各种办法去弥补这些缺陷,通过一些机制让面向对象语言越来越来趋于完善。

Author: wnxy
Link: http://www.wnxy.xyz/2019/01/01/Disadvantages-and-problems-of-object-oriented-languages/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.