设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
17460 人已学习
课程目录
已更新 20 讲 / 共 100 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (3讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
不定期加餐 (2讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
设计模式之美
登录|注册

06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?

王争 2019-11-15
在上两节课中,我们讲了面向对象这种现在非常流行的编程范式,或者说编程风格。实际上,除了面向对象之外,被大家熟知的编程范式还有另外两种,面向过程编程和函数式编程。面向过程这种编程范式随着面向对象的出现,已经慢慢退出了舞台,而函数式编程目前还没有被广泛接受。
在专栏中,我不会对函数式编程做讲解,但我会花两节课的时间,讲一下面向过程这种编程范式。你可能会问,既然面向对象已经成为主流的编程范式,而面向过程已经不那么推荐使用,那为什么又要浪费时间讲它呢?
那是因为在过往的工作中,我发现很多人搞不清楚面向对象和面向过程的区别,总以为使用面向对象编程语言来做开发,就是在进行面向对象编程了。而实际上,他们只是在用面向对象编程语言,编写面向过程风格的代码而已,并没有发挥面向对象编程的优势。这就相当于手握一把屠龙刀,却只是把它当作一把普通的刀剑来用,相当可惜。
所以,我打算详细对比一下面向过程和面向对象这两种编程范式,带你一块搞清楚下面这几个问题(前三个问题我今天讲解,后三个问题我放到下一节课中讲解):
什么是面向过程编程与面向过程编程语言?
面向对象编程相比面向过程编程有哪些优势?
为什么说面向对象编程语言比面向过程编程语言更高级?
有哪些看似是面向对象实际是面向过程风格的代码?
在面向对象编程中,为什么容易写出面向过程风格的代码?
面向过程编程和面向过程编程语言就真的无用武之地了吗?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(155)

  • 猫切切切切切
    操作系统是业务无关的,它更接近于底层计算机,因此更适合用面向过程的语言编写。而接近业务的也就是接近人的软件,则更适合用面向对象的语言编写。
    2019-11-15
    5
    133
  • 相逢是缘
    使用任何一个编程语言编写的程序,最终执行上都要落实到CPU一条一条指令的执行(无论通过虚拟机解释执行,还是直接编译为机器码),CPU看不到是使用何种语言编写的程序。对于所有编程语言最终目的是两种:提高硬件的运行效率和提高程序员的开发效率。然而这两种很难兼得。
    C语言在效率方面几乎做到了极致,它更适合挖掘硬件的价值,如:C语言用数组char a[8],经过编译以后变成了(基地址+偏移量)的方式。对于CPU来说,没有运算比加法更快,它的执行效率的算法复杂度是O(1)的。从执行效率这个方面看,开发操作系统和贴近硬件的底层程序,C语言是极好的选择。
    C语言带来的问题是内存越界、野指针、内存泄露等。它只关心程序飞的高不高,不关心程序猿飞的累不累。为了解脱程序员,提高开发效率,设计了OOP等更“智能”的编程语言,但是开发容易毕竟来源于对底层的一层一层又一层的包装。完成一个特定操作有了更多的中间环节, 占用了更大的内存空间, 占用了更多的CPU运算。从这个角度看,OOP这种高级语言的流行是因为硬件越来越便宜了。我们可以想象如果大众消费级的主控芯片仍然是单核600MHz为主流,运行Android系统点击一个界面需要2秒才能响应,那我们现在用的大部分手机程序绝对不是使用JAVA开发的,Android操作系统也不可能建立起这么大的生态。

    作者回复: 👍

    2019-11-16
    3
    92
  • 辣么大
    我们以历史的时间线看看这两种语言的演进过程。
    1969年贝尔实验室提出Unix操作系统
    1972年贝尔实验室的Dennis Ritchie开发C语言。
    1973年他用C语言重写了Unix。
    1991年Linus Torvalds提出Linux。

    另外一条线面向对象语言的发展:
    1972年第一个面向对象的编程语言是Simula发布。
    1996年,Java1.0发布,流行的主要原因是jvm,Write Once, Run Anywhere(编写一次,到处安装JRE)

    从时间上看,面向对象概念的提出晚于面向过程。C语言因商业应用成熟要比面相对象的编程语言早。

    C语言的流行主要是因为Unix和Linux操作系统的实现基于C语言。类Unix系统可以运行在服务器,嵌入式设备,移动设备上。

    一个东西的好坏要综合考虑:面向过程和面向对象各有各的优缺点。一门编程语言的提出是为了解决某些特定的问题。面向对象和面向过程在应用上各有各的位置。
    2019-11-15
    3
    32
  • Paul Shan
    思考题
    大学学习操作系统的时候,大部分内容已经忘了,还记得老师说过,虽然操作系统是用C语言写的,但是面向对象的思想早已深入到操作系统的源代码中。
    2019-11-15
    28
  • LYy
    操作系统虽然是用面向过程的C语言实现的 但是其设计逻辑是面向对象的。
    C语言没有类和对象的概念,但是用结构体(struct)同样实现了信息的封装,内核源码中也不乏继承和多态思想的体现。
    面向对象思想,不局限于具体语言。
    2019-11-15
    19
  • lijun
    深夜追设计模式!🤑
    2019-11-15
    2
    11
  • 李小四
    设计模式_06
    操作系统的源码一直没读过,但我认为如此复杂的系统设计,(站在现在的时间点)用面向对象风格(或实现相同目的其他方式)来编写代码是更合适的,而且从Linux的模块化分来看,推测有类似的实践。

    老话说, 机器能读懂所有代码, 但人不一定. 对于机器来说, 每一次业务调用流程都是序列化的, 机器并不在乎面向对象, 但人在乎. 正如本文所讲, 编程语言离机器越来越远, 离人越来越近. 为了迁就人, 我们使用了执行效率更低的语言, 有了更多的中间环节, 占用了更大的内存空间, 换来的是这个行业的蓬勃发展以及让人类的便捷生活和能力延伸.
    2019-11-15
    10
  • 墨雨
    Java代码的注释是不是没改呀……为啥还是结构体呢……。感觉这几篇都比较偏理论,有点拖踏

    作者回复: 注释忘了改 我改下 多谢提醒

    2019-11-15
    1
    7
  • 未未的未来
    疑问:
    老师举的文件那个例子,使用面向对象编程那个,不是封装了函数,用函数对操作过程进行了抽象了吗,为什么老师说没有用到封装、抽象这些特性?
    思考题:
    理解,C语言虽然是面相过程语言,但是面向过程语言也可以写面向对象的,另外,C语言更贴近底层一些,写操作系统的话还是有性能上的优势。

    作者回复: 你指出的这点很好。关于封装,有两种理解,一种是狭义的面向对象特性:封装是一种信息隐藏,需要把数据和方法放到一起,而c语言实现的代码,数据和方法是分离的。封装的另一种广义的理解,可以包含你指的封装函数。抽象实际上我们前面章节中也讲到过,比较没有特异性,有的时候不看做面向对象的特性。

    2019-11-15
    8
    7
  • 摸爬滚打三十年
    老师前几节讲的都是基本概念,每读一遍就感觉加深了一层印象和理解。学习本节最大的感受,面向对象和面向过程之间相互对比更容易理解,他们最大的区别1.代码的组织单元:面向对象是类和对象,面向过程是函数和数据。2.是否支持四大特性以及对四大特性的支持程度,面向过程不支持继承和多态,在封装和抽象上,面向对象要更加深刻一些。面向对象对类抽象,面向过程抽象成方法,面条式的执行过程,流水线的操作方式。通过访问控制,面向对象对外暴露有限的成员属性和方法。总体来说,面向对象编程更适合人的思维习惯,能够客观反映代码和真实世界的关系。我的一点体会,不知道对不对,过一段时间再来回顾一次,看到时候的理解会不会更深。
    2019-11-15
    4
  • KaitoShy
    我理解C++的出现主要是为了C语言中的泛型编程问题。而Java 的出现是为了抽象对计算机的依赖,更专注于业务。对于计算机底层 C/C++ 可能更适合,而 C 的对于程序员来说自由度是最大的。再看Linux的发展,1991年,林纳斯基于Unix的编写的,可能他更善于这个语言,他编写 git 的时候也是用的 C。Unix选择C也是由于自己擅长的原因
    2019-11-15
    3
  • 月坛小雨
    这套课程的配图,没有《算法》那套用心呀

    作者回复: 因为本身这门课的图就没有像算法那样多。这门课代码比较多。

    2019-11-15
    2
    3
  • 寒江独钓者
    读过linux内核源码和python解释器源码的应该都明白,所谓面向过程的C语言照样可以实现面向对象的思想,有很多设计都是非常优雅的,付出的代价并不高,我并不认为面向对象编程语言做相同的事情付出的代价会更低。编程思想、设计模式跟语言是没有关系的,编程思想和设计模式是指导我们编程的,而编程语言只是一种实现工具罢了。
    2019-11-17
    2
  • 筱乐乐哦
    我的理解不矛盾,理由如下
    1、操作系统更多的是和硬件打交道,需要考虑到语言本身翻译成机器语言的成本和执行效率,尤其总要。
    2、如linux内核、总线、文件系统网络等的设计,也是具有面向对象过程的思想,很好的支持了常见的文件系统的挂在、内核的升级和对硬件的热插拔、网络等的处理,常见的服务器多数都是linux,为啥不用window,我的理解和设计实现有很大的关系,尤其是网络、安全、权限、标准等等
    3、linux操作系统,本身就是一个大的抽象,属于一个硬件和高级软件连接的桥梁

    也希望争哥发表下自己的看法,指点指点
    2019-11-16
    2
  • 熊斌
    OOP 是“离机器更远、离人更近、更智能”
    面向过程语言(例如C)离机器“更近”,Unix/Linux都是离硬件设备最近的操作系统级别的系统,所以C语言是更合适的。
    2019-11-15
    2
  • 作为新手的我觉得不矛盾。用面向过程的语言也是可以实现面向对象的思想的。但是一些面向对象的语言的特性貌似需要操作系统来完成,应该不能直接用特别高级的语言来开发操作系统吧。希望老师指正,希望更多志同道合的战友一起交流进步。
    2019-11-15
    2
  • 编程界的小学生
    我个人认为操作系统之所以用C语言写的可能是性能更高一点吧,还有就是c更底层一些,面向对象语言更高级一些,更先进一些,适合大型网站或者app开发等。所以每种语言都有不同的使用场景。JAVA是世界上最好的语言,不接受任何反驳。别跟老夫扯什么php!
    2019-11-15
    2
  • Better me
    讨论题发表一下自己的意见
    用面向对象语言结合面向过程思想写程序,这就相当于手握一把屠龙刀,却只是把它当作一把普通的刀剑来用。相反我们也可以用面向过程语言结合面向对象思想来写程序,那也能达到很好的易复用、易扩展、易维护的效果,相对来说代价会比较高,毕竟语言本身没有提供这种语法机制,需要在我们编程中体现处理实属不易。
    2019-11-19
    1
  • 面向过程最主要的特点就是数据和方法相分离。我哭了,虽然一直用的是MVC框架,但是没有业务建模;基本上都是数据导向,妥妥的面向过程开发。
    2019-11-19
    1
  • 斐波那契
    我觉得主要原因还是因为大部分面向对象编程语言不能操作底层 理论上 只要语言支持操作底层 就可以写操作系统 c是最早出现的 比较接近人类思维的 能够操作底层的编程语言 并且编写出经典的操作系统而一炮走红 跟是不是面向过程风格面向对象风格没太大关系 操作系统复杂主要是硬件管理的复杂以及“如何高效操作”的复杂 简单说 随着发展 计算机被赋予了越来越多的能力及功能导致管理硬件的操作系统越来越复杂
    2019-11-18
    1
收起评论
99+
返回
顶部