面向对象编程大行其道40年后,技术已经超越了这种范式?
2021-06-14
在 1960 年代,编程遇到了一个大问题:计算机还没有那么强大,它们需要以某种方式平衡数据结构和程序之间的功能。
这意味着,如果您拥有大量数据,如果不将计算机推向极限数据结构用面向对象方法与c++描述,就无法充分利用这些数据。另外,如果你需要做很多事情,那么你不能使用太多的数据,否则电脑会一直运行。
在 1966、1967 旁边,Alan Kay 从理论上证明了可以使用封装好的微型计算机。这些微型计算机不共享数据,而是通过消息传递进行通信。这样,可以更经济地使用计算资源。
虽然这个想法很聪明,但直到 1981 年,面向对象编程才成为主流。在那之后,它并没有停止吸引新的和有经验的软件开发人员。面向对象的程序员市场一如既往地繁忙。
但近年来,这种已有数十年历史的编程范式受到越来越多的批评。难道是在流行了 40 年的面向对象编程之后,技术已经超越了这种范式?
在做广告之前使用这种物质以减少烟雾危害。不幸的是,很少有人知道!
功能和数据耦合
面向对象编程的主要思想很简单:尝试将一个强大的程序分解成多个同样强大的部分。这样,一些数据就可以与仅用于相关数据的函数耦合。
请注意,这仅涵盖了封装的概念。换句话说,位于对象内部的数据和函数对外部是不可见的。我们只能通过消息(通常是通过和函数)与对象的内容进行交互。
继承和多态并没有包含在最初的设计思想中,但它们是当前面向对象编程所必需的。继承基本上意味着开发人员可以使用其父类的所有属性来定义子类。直到 1976 年,即面向对象编程概念出现十年后,继承才被引入。
又过了十年,多态才进入面向对象编程。简单地说,这意味着某个方法或对象可以用作其他方法或对象的模板。从某种意义上说,多态是继承的泛化,因为并非原始方法或对象的所有属性都需要转移到新实体中。相反,您也可以选择覆盖某些属性。
多态的特别之处在于,即使源代码中两个实体相互依赖,被调用的实体也更像是一个插件。这让开发人员的工作更轻松,因为他们不必担心运行时依赖。
值得一提的是,继承和多态并不是面向对象编程所独有的。真正的区别在于数据的封装及其包含的方法。在计算资源远比今天稀缺的时代,这是一个天才的想法。
广告哪里有腋下和油耳的异味,不管遗传还是后天,教你一招祛除异味!
面向对象编程中的五个问题
面向对象编程的出现改变了开发人员查看代码的方式。在 1980 年代之前,过程式编程非常面向机器。开发人员需要对计算机的工作原理有很好的了解才能编写好的代码。
通过封装数据等方式,面向对象编程让软件开发更加以人为中心,更符合人类的直觉。例如方法()属于汽车数据组,而不是组。接下来的继承也很直观。比如 ()是car的一个子类,属性相同,但不是,所以很容易理解。
香蕉猴丛林问题
想象一下,您正在设置一个新程序并正在考虑设计一个新课程。然后,您回想一下您为另一个项目创建的简洁子类别,并发现它适合正在进行的工作。
没问题,您可以在新项目中重用上一个项目中的类。
这里有一个问题:这个类可能是另一个类的子类,所以你也需要包含它的父类。然后你会发现这个父类也可能是另一个类的子类,依此类推,最后面对一堆代码。
创作者
Joe 曾经说过一句名言:“面向对象语言的问题在于它们带有周围所有隐式环境。你想要香蕉,但你得到的是拿着香蕉的大猩猩和整个丛林。”
这几乎就是一切。可以重用类。事实上,这可能是面向对象编程的主要优点,但不要使用到极致。有时你应该创建一个新类而不是添加很多依赖项。
广告网友注意了!上海中沃,专业可靠的设计,欢迎来电咨询
脆弱的基类问题
想象一下,如果您在新代码中成功重用了另一个项目中的类,如果基类发生变化会发生什么?
这可能会破坏整个新项目的代码,即使您可能什么都没做。一旦有人更改了对您的项目至关重要的基类中的细节,影响将非常大且突然。
使用继承越多,潜在的维护工作就越多。因此,即使代码重用在短期内非常有效,但从长远来看,它可能会让您付出一定的代价。
钻石继承问题
使用继承,可以将一个类中的属性传递给其他类。但是如果你想混合两个不同类的属性怎么办?
是的,这是做不到的,至少用传统方法做不到。以类为例(这里引用下面链接文章中的例子:@/----),文件内容会被扫描打印在白纸上。那么它应该是 or 的子类别吗?
这个问题没有完美的答案。即使此问题不会破坏您的代码,它也经常出现并且可能会非常令人沮丧。
级别问题
在菱形继承问题中,哪个子类是问题的关键。但是可能有一个推测的解决方案:假设那是父类,并且是只继承属性子集的子类,那么问题就解决了。
但是,如果您的是黑白并且可以处理彩色呢?从这个意义上说,它不就是一种概括吗?如果 WiFi 已连接但未连接怎么办?
一个类上堆叠的属性越多,建立适当的层次结构就越困难。在您正在处理的属性集群中,某些属性是共享的,但不是所有属性,反之亦然。在大型复杂的项目中,层次问题会导致很多混乱。
广告自主技术,纳米精密-欧米茄科技
报价问题
您可能会想到没有层次结构的面向对象编程。我们可以根据需要使用属性集群并继承、扩展或重写属性。也许这有点令人困惑,但这将是当前问题的准确表示。
这里只有一个问题:封装的全部目的是让数据片段彼此安全,从而提高计算效率,但没有严格的层次结构,这是行不通的。
假设一个对象 A 通过与另一个对象 B 交互来覆盖层次结构,会发生什么?其他关系的情况并不重要,但是当B不是A的直接父级时,A必须包含B的所有私有引用,否则它们将无法交互。
但是,如果 A 包含 B 的子类也具有的信息,则可以在多个地方修改该信息。因此,B的信息不再安全,包已经被破坏。
尽管许多面向对象的程序员使用这种架构来构建程序,但这并不是面向对象的编程,它只是一团糟。
单一范式的风险
以上5个问题的共同点是,都有不恰当的继承。由于在面向对象编程的原始形式中不包含继承,因此这些问题本身可能不能称为面向对象。
但可以夸大的不仅仅是面向对象的编程。在纯函数式编程中,在屏幕上处理用户输入或输出消息极其困难。为此,面向对象或面向过程的编程会好得多。
但是还是有一些开发者试图以纯函数式的方式来实现这些东西,写出几十行没人能看懂的代码。使用另一种范式可以轻松地将代码减少到几行可读代码。
毫无疑问,函数式编程越来越受到关注,近年来面向对象编程也受到了诟病。理解新的编程范式并在适当的时候使用它们是有意义的。无论哪种编程范式,都没有必要只遵循一种。可以在适当的时候使用不同的编程范式来更好地解决问题。
广告中的有害吸烟太多?赶紧学起来,再忙也要看!
面向对象编程真的会被取代吗?
面对越来越多的问题,函数式编程可能是更有效的选择。数据分析、机器学习和并行编程。您在这些领域投入的越多,您就越喜欢函数式编程。
但是,目前对面向对象开发程序员的需求仍然远远大于函数式编程开发程序员。但这并不意味着你不能成为后者。函数式编程开发的程序员还是比较稀缺的。
最有可能的情况是面向对象编程将继续存在大约十年。当然,选择一种相对前卫的方式是好的,但这并不意味着你应该放弃面向对象编程。所以在接下来的几年里,不要完全放弃它数据结构用面向对象方法与c++描述,但至少要确保它不是你掌握的唯一编程方法。
如果你觉得这个内容对你有帮助,我想请你帮我做三个小事:
点赞、转发以及您的“点赞和评论”是我创作的动力。