面向对象程序设计大行其道几十年后,已经在面临淘汰?
全文共3838字 , 预计学习时长10分钟
文章插图
图源:unsplash
编程在上世纪60年代遇到了一个大问题:计算机那时还没有那么强大 , 需要以某种方式在数据结构和进程之间分配容量 。 这意味着如果拥有大量数据 , 那么在不将计算机推向极限的情况下 , 很多事情将无法完成 。 另一方面 , 如果需要做很多事情 , 那么就不能使用过多的数据 , 否则计算机将永远占据空间 。
接着艾伦·凯(AlanKay)大约于1966年或1967年得出理论认为可以使用封装的微型计算机 , 这些微型计算机不共享数据 , 而是通过消息传递进行通信 。 这样可以更加经济地使用计算资源 。
尽管这个想法很巧妙 , 但直到1981年 , 面向对象编程才成为主流 。 但是从那以后 , 它并没有停止吸引软件开发新手和老手 。 面向对象编程的程序员一如既往的繁忙 。
但近年来 , 这一已有十年历史的范式受到越来越多的批评 。 难道是在面向对象程序设计大行其道40年之后 , 技术已经超越了这种范式?
文章插图
带数据的耦合函数是否可笑?面向对象编程的主要思想非常简单:尝试将一个程序分解为功能强大的整体 。 随之而来的是 , 将数据片段和仅在相关数据上使用的那些函数耦合在一起 。
请注意 , 这仅涵盖封装的概念 。 也就是说 , 位于对象内部的数据和函数对于外部是不可见的 , 一个人只能通过消息(通常称为getter和setter函数)与对象的内容进行交互 。
继承和多态并没有包含在最初的想法中 , 但是对于当今的面向对象编程而言 , 这是必需的 。 继承基本上意味着开发人员可以定义具有其父类具有的所有属性的子类 , 直到1976年——面向对象的程序设计概念问世十年后 , 才将其引入 。
十年后 , 多态进入了面向对象的程序设计 。 从根本上讲 , 这意味着方法或对象可以用作其他方法的模板 。 从某种意义上说 , 这是继承的概括 , 因为并非原始方法或对象的所有属性都需要传输给新实体;相反 , 可以选择覆盖属性 。
多态的特殊之处在于 , 即使两个实体在源代码中相互依赖 , 被调用实体的工作方式也更像插件 。 这使开发人员的工作更加轻松 , 他们不必再担心运行时的依赖关系 。
值得一提的是 , 继承和多态性并不是面向对象编程所独有的 。 真正的区别在于封装数据及其所属的方法 。 在那个计算资源比今天稀缺得多的时代 , 这是一个天才般的想法 。 面向对象的编程并不可笑 , 它使编码变得容易得多 。
文章插图
图源:unsplash
文章插图
面向对象编程中的五大问题面向对象编程一问世便改变了开发人员查看代码的方式 。 在1980年代以前 , 面向过程编程通常以机器为中心 , 开发人员需要非常了解计算机如何工作才能编写好的代码 。
通过封装数据和方法 , 面向对象的编程使软件开发更加以人为中心 。 与人类的直觉相符 , 方法drive()属于数据组 car , 但不属于teddybear组 。 当继承产生时 , 这也很直观 。 Hyundai是car的一个子类 , 并且具有相同的属性 , 但PooTheBear却不是 , 这是完全合理的 。
这听起来像是一台强大的机器 。 但问题在于 , 只懂面向对象代码的程序员将会用这种思维方式思考他们所做的一切 。 就像人们到处看到钉子一样 , 因为他们只有锤子 。 正如我们将在下面看到的那样 , 当你的工具箱只有锤子时 , 可能会导致致命的问题 。
大猩猩丛林香蕉问题
如果你正在设置一个新程序 , 并且正在考虑设计一个新类 。 你可能会回想起为另一个项目创建的简洁的小类 , 并且意识到这对当前正在尝试的工作非常适合 。 没问题!可以将旧项目中的类重用于新项目 。
除了该类实际上可能是另一个类的子类之外 , 因此现在还需要把父类包括在内 。 然后你意识到父类也依赖于其他类 , 并且最终包含了代码堆 。
Erlang的创建者Joe Armstrong的这句话非常著名:“面向对象编程语言的问题在于 , 它们具有随身携带的所有隐式环境 。 你想要香蕉 , 但是得到的是一只拿着香蕉的大猩猩和整个丛林 。 ”
这对此方法进行了很好的说明 。 可以重用类 , 实际上 , 这可能是面向对象编程的主要优点 。 但不要走极端 , 有时最好编写一个新类 , 而不是为了写重复代码而添加大量依赖项 。 要灵活变通 , 不要死板地遵从某个范式 。
- 信服|深信服何朝曦:安全不能只面向静态风险进行建设,应该从"面向风险"转向"面向能力"
- 《深入理解Java虚拟机》:对象创建、布局和访问全过程
- 面向工业化量产,GE粘结剂喷射金属3D打印发起合作伙伴计划
- 第一章 1.4 信号,槽和元对象
- Feign解决服务之间传递文件、传递list,map、对象
- Java高级特性:循序渐进地培养面向对象的思维方式
- 第8天 | 12天搞定Python,面向对象
- 夏普120寸8K电视量产,月产300台,首发对象锁定“谁”?
- C/C++编程笔记:C++面向对象和Java面向对象的区别
- 牛皮了!世界级架构师,图解面向对象编程,小学生都能看得懂