怎样的思维过程导致人们发明了面向对象编程?

作者 | Alan Kay

译者 | 弯月,责编 | 郭芮

头图 | CSDN 下载自视觉中国

出品 | CSDN(ID:CSDNnews)

以下为译文:

1992年,ACM邀请我为他们举办的第二届“编程语言历史”大会撰写一篇有关我的工作经历的文章。如今,这段历史有多个版本,其中Bret Victor网站上的“Smalltalk的早期历史”(地址:http://worrydream.com/EarlyHistoryOfSmalltalk/)记载了很多细节,有兴趣的人可以去看看。

我需要申明两点:(a)在1966年的工作中,我确实用到了“面向对象的程序设计”这个词;但是,(b)我当时使用这个词的本意是,对我在多个工作经历中的想法的“轮换”和概括,这些工作经历包括:

  • 一开始我是一名生物学家

  • 从1961年开始担任美国空军程序员,当时的工作是编写“语义文件系统”

  • 后来投身B5000计算机的硬件

  • 很长一段时间都在从事“多程序”和“分时”操作系统的工作

  • 最令人惊讶的是从事过Ivan Sutherland的Sketchpad程序

  • 在Simula中度过了一段平淡无奇的时光

  • 最终从事网络计算机(投身研究社区的ARPAnet)

1966年11月某人的一句极其简单的话深深地触动了我:“只要有足够多可以相互通信的计算机,那么就是说任何工作都可以在一台计算机上完成。”这是因为每台计算机都代表了整个网络。

抛开实际的困难不谈(实际上我是一个非常懒惰的数学家,所以我与务实勤奋的程序员八杆子打不着),这个想法非常诱人,因为与传统的过程式和以数据结构为组件的思想相比,面向对象编程的扩展性更好。

而且更干净,更适合整个系统设计。

而且,这个想法甚至可以从“设计和编程模拟”的角度来思考。有一次在一周内我看到了两个系统:Sketchpad和第一版Simula,这两个系统的目的都是模拟包含许多相互关联的进程的复杂实体,因而产生了这个想法。

认为一切都由“经由消息互相通信的语义软件计算机”构成,这种思想的另一项非常诱人的特性是,“数据”的某些丑陋的属性不仅可以修正,甚至可以完全消除。例如,标准的硬件和紧密映射到硬件上的编程语言可以引出简单数组的概念,但无法产生“数据结构”的概念,因为数据结构更为复杂,如系数矩阵、堆栈、队列等。如果将其视为“进程”,然后内部决定“赋值箭头”的含义,就会更容易一些。

这样就可以引出比“数据”更漂亮的概念,这些概念依然有状态,但没有竞争条件。例如,在对象内部,对象可以在需要时确定历史的版本,可以做“原子事务”,可以在所有关系都是一致的情况下仅允许查看。还有更多特性。这种新的概念远胜于“数据”的概念,它可以让对象随着时间流逝而发展,并“学习”新的东西,但会更安全。

然后还有模拟想法本身,这里“数据”和“状态”的概念开始让位于“有能力的对象”,这些对象可以互相操作,就像生物的细胞或者人类社会那样。

所以,引出这个想法的思维过程基本上就是“系统思维过程”,可以很容易地将定义进程组成的系统,即任何进程构成的任何系统。

这个概念与绝大多数读者熟知的OOP(如C++、Java等语言中的OOP)并不一样。

主要的区别在于视角上。C++和Java语言主要利用对象来定义类似于数据结构的新物体,编程语言本身也是基于数据结构的(如“setter”将任何实体变回一个任何人都可以操作的数据结构)。理论上,这实际上就是“抽象数据结构”,尽管对象的概念也能实现这一点,但这并不是对象的原本目的。

通过我上面的描述,一个优秀的系统设计师就能够设计并实现出优秀的系统,甚至是非常大型的系统也没问题。显然,如果不是经验丰富的设计师,就无法体现出其中的许多好处。

还有一点很重要,这个范式定义的强大和通用性,是与编程风格无关的(这正是“系统的模拟”含义的核心)。

一个对象可以完美地模拟一个函数、过程、数据结构等,所以一切已有的东西都可以完美支持,但对象还可以模拟非常智能的物体,来提供更强大的功能。

然而,问题在于,计算领域内很少有人下功夫理解“进程的广泛使用、可扩展的系统”的含义,大多数人在扩展程序规模时,依然无法摆脱陈旧、腐朽的方式。

在Parc项目中,我们构思了大量的概念,而编写的代码行数非常少,因为我们尽可能使用这种新的方式来组织并实现复杂的系统。(如今,这一思想已有了更深入的理解,但即使是在当年,我们也常常被其强大之处所折服)。

原文:https://www.quora.com/What-thought-process-would-lead-one-to-invent-object-oriented-programming/answer/Alan-Kay-11

更多精彩推荐
☞AI 终极问题:我们的大脑是一台超级计算机吗?
☞屏保壁纸引发血案,三星手机瞬间变砖
☞可怕!CPU 竟成了黑客的帮凶!
☞如何用NLP辅助投资分析?三大海外机构落地案例详解
☞这 10 个云计算错误,会让你的业务一蹶不振!
☞好扑科技结合区块链行业发展趋势,重磅推出“好扑区块链合伙人”计划
你点的每个“在看”,我都认真当成了喜欢

为什么要发明面向对象编程?相关推荐

  1. 零基础入门学习Python(35)面向对象编程

    self是什么? Python的self相当于C++的this指针 由同一个类可以生成无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,Python就知道要操作哪个对 ...

  2. python面向对象编程的优点-Python面向对象编程

    面向过程编程,重点在于过程(可以理解成how),即以过程为核心,计算机/写代码的人会把精力聚焦在具体的实现过程上,这个过程第一步干什么,第二步干什么,直到最后完成了你的目标. 面向对象编程,重点在于对 ...

  3. Kotlin极简教程:第7章 面向对象编程

    原文链接:https://github.com/EasyKotlin 在前面的章节中,我们学习了Kotlin的语言基础知识.类型系统.集合类以及泛型相关的知识.在本章节以及下一章中,我们将一起来学习K ...

  4. JavaScript(四)——面向对象编程、BOM、DOM、表单验证、jQuery

    文章目录 1. 面向对象编程 2. 操作BOM对象(重点) 3. 操作DOM对象(重点) 4. 操作表单(验证) 5. jQuery 1. 面向对象编程 (1) 原型对象 javascript.Jav ...

  5. lua的面向对象编程,封装,继承,多态的实现

    简介 1. lua面向对象编程是基于元表metatable,元方法__index来实现的,具体元表和元方法的介绍 请见Lua的元表metatable及元方法 2. 语法糖 语法糖是由英国计算机科学家彼 ...

  6. [Python]小甲鱼Python视频第037课(类和对象:面向对象编程 )课后题及参考解答

    # -*- coding: utf-8 -*- """ Created on Mon Mar 11 20:09:54 2019@author: Administrator ...

  7. 面向对象编程,设计原则,设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象编程,设计原则,设计模式 面向对象编程 面向对象编程与面向过程编程的区别 面向对象软件开发的优点 面向对象编程语言 C ...

  8. 面向对象编程基本概念

    引言 在软件工程的早期,史诗般的挣扎着项目的复杂性,增长以及管理大型开发团队的挑战.面向对象编程(OOP)为软件社区引入了一场革命,以帮助解决这些问题. OOP专注于模块化,改变容忍度,代码重用,易于 ...

  9. 我所偏爱的 C 语言面向对象编程范式

    我所偏爱的 C 语言面向对象编程范式 面向对象编程不是银弹.大部分场合,我对面向对象的使用非常谨慎,能不用则不用.相关的讨论就不展开了. 但是,某些场合下,采用面向对象的确是比较好的方案.比如 UI ...

最新文章

  1. linux uwsgi 非root,ubuntu-除非root用户,否则uWSGI Emperor权限被拒绝
  2. Python练习-一个简单易懂的迭代器,了解一下
  3. 计算机网络试卷模板,用Word制作真实试卷模板(下)
  4. SSM实现个人博客-day03
  5. java 四舍五入_《JAVA编程思想》5分钟速成:1-4章:概述
  6. zookeeper集群部署(分布式)
  7. 前端学习(642):字面量
  8. 电子书下载:Ultra-Fast ASP.NET 4.5 2nd
  9. 02 unix文件系统和命令
  10. jquery select
  11. 苹果反垄断案败诉!应用商店30%抽成太高惹民怨,市值一夜跌了整个特斯拉
  12. java长连接心跳包_socket中的短连接与长连接,心跳包示例详解
  13. Python各类图像库的图片读写方式总结
  14. 【SpringBoot_ANNOTATIONS】生命周期 04 BeanPostProcessor 后置处理器
  15. [zz]大师,一个专注的“疯子”
  16. 群晖服务器文件管理套件,群晖drive套件的使用教程
  17. java循环结构sum关于质数,质数
  18. Win系统 - 开启 WIN10 隐藏的卓越性能模式
  19. android 仿微信demo————注册功能实现(移动端)
  20. 软件开发延期引发纠纷-律师随笔

热门文章

  1. 使用pt-query-digest进行日志分析
  2. 封装Js事件代理方法
  3. Java SSH远程执行Shell脚本实现
  4. Python-OpenCV ·学习笔记
  5. [Ubuntu] docker 安装及使用
  6. netstat 命令 与 ps 命令
  7. 使用 MobaXterm 连接矩池云 GPU服务器
  8. 解决矩池云使用中ssh链接的时候日志丢失
  9. 旋转成分矩阵结果分析_30分钟学会PCA主成分分析
  10. 【QT】QT从零入门教程(十六):QSS样式表