重新思考面向过程与面向对象

面向过程与面向对象的思考方式

面向过程面向对象的差异主要体现在思考方式上,面对同样一个任务,

面向过程的思考方式,首先想的是一步步该怎么做

  • 对任务进行分解,先干什么后干什么,划分成不同阶段的子任务
  • 对每个阶段的子任务进一步分解,形成函数,根据输入输出将所需数据整理为数据结构
  • 将任务串接起来,完成总任务
  • 重构,将重复工作抽象成单独的函数
  • 复用的单元是函数

面向对象的思考方式,首先想的是任务中利益相关方都有谁

  • 找到任务中的所有利益相关方,并对其归类
  • 确定每个利益相关方类别的属性,并划分责任和义务,定义出行为,抽象出类别
  • 对类进行实例化,实例间相互协作配合完成任务
  • 重构,疏理类别之间的关系,将共有部分抽离成基础类,其他类从基础类继承而来
  • 复用的单元是类

如果以开公司为例的话:

面向过程的思考方式是,要采购原材料、生产产品、卖产品、管理入账出账,因此需要生产人员、销售人员、财务等,将他们串起来,公司就运转起来了。

面向对象的思考方式是,公司要分为生产部门、销售部门、财务等,分别有各自的职责,生产的要记录生产数据、接收原材料、产出产品,销售的要记录销量、卖出产品……

面向过程的思考方式偏逻辑、偏动作、偏执行,更符合人类的思考方式,像员工视角,把人做事的步骤函数化代码化

面向对象的思考方式偏抽象、偏数据、偏象形,像上帝模式,像老板视角,各个利益相关方仿佛具有了生命,它们之间通过相互配合完成任务

在我看来,思考方式是面向过程与面向对象的最大差异,而不在于多态等语言特性。

面向过程与面向对象的联系

面向过程 和 面向对象并不是对立的。在问题复杂后,面向过程也会模块化,把同一类操作以及共有的数据结构整理在一起,朝面向对象迈进,就像公司从混乱的小作坊做大后就会形成部门;面向对象在执行具体工作时,仍是面向过程的,也是有步骤的,就像公司生产线上质检员工,仍需要第一步检查什么、第二步检查什么。

此外,再谈谈语言层面面向过程语言(比如C语言),可以是流程化的,一个函数一个函数地调用,但也能表达面向对象思想,比如模块化后,将结构体和函数规划好所属类别,使用时类和对象的思想在脑袋里;支持面向对象的语言(比如C++),是在语言层面对类和对象的思想提供了支持,将脑袋里的类别用语言中的class具现出来,将类别间的衍生关系用语言中的继承具现出来,同时在编译器(编辑器)上提供了访问的边界,并有相应的语法来界定。

如何选择

两种编程思路并无明显优劣之分,一切只看适不适合。面向过程模块化做得好,也可以很清晰。面向对象设计过度,也会恶心人。如何选择呢?

这里直接贴上SIGAI丁老师的建议,

  • 评估方法:预测未来,找到复用概率最高的几个点
  • 将这几个点用如下原则进行初步评估:高内聚,低耦合
  • 按照以上方法评估之后,心中往往已经有了答案

一般而言:

  • 注重复用和可维护性时, 面向对象多数要胜出的
  • 注重短期开发速度,而且是一次性的,面向过程肯定是首选

以上。

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛客网

字节跳动一面凉经

【每日一语】如果这世界上真有奇迹,那只是努力的另一个名字。生命中最难的阶段,不是没有人懂你,而是你不懂你自己。——尼采

65510
来自专栏企鹅号快讯

编程为什么入门首选C语言呢

为什么入门首选C语言呢 C语言除了能让我们了编程的大门,也让我们了解到程序的运行原理,和计算机底层是如何交互的,这些底层的知识决定了你的高度,也决定了你的未来的...

48160
来自专栏程序人生 阅读快乐

Java数据结构和算法.(第二版)

《Java数据结构和算法》(第2版)以一种易懂的方式教授如何安排和操纵数据的问题,其中不乏一些难题:了解这些知识以期使计算机的应用获得最好的表现。不管使用何种语...

9120
来自专栏程序员互动联盟

【答疑释惑第十四讲】如何学习数据结构?

疑惑一 为什么学习编程前,先要掌握计算机组成原理? 很多的学习编程的小伙伴,特别是上来就学习java的小伙伴,很多对底层语言的实现存在一种莫名的畏惧感,老是觉得...

31360
来自专栏Java技术栈

实现高并发更轻松!这个编程语言竟然超过了Java...

曾任猎豹高级工程师、搜狐社交产品中心服务端负责人,现任区块链创业公司 CTO。文章中,他会详细介绍自己接触Golang的经历,以及Golang语言的优势。

11830
来自专栏程序员互动联盟

为什么大家都怕学C++?

现在很多人都觉得C++学起来相当的费劲,特别是对刚入门的,看到最后直接就没法看下去了,抽象的逻辑太多了,越看越迷糊,最后也就选择了放弃。笔者看到很多大学开设的第...

31950
来自专栏程序员互动联盟

要想精通C语言,必须先学习汇编吗?

编程语言里面很少有人直接说出精通两个字,特别是一些入行好多年的程序员,从语法来讲C语言相对来讲入门还是比较容易,在高级语言还没有完全展开的年代,C语言算入门比较...

14630
来自专栏PPV课数据科学社区

【V课堂】R基本操作函数脉络图

如果你使用R做数据分析,你一边会感到无比的便捷,一边也会感到苦恼,便捷在于它丰富的功能和简单的代码,通常使用几行代码就能解决一个很复杂的事,这得益于他丰富的pa...

364140
来自专栏Java架构

资深架构师谈Java——最牛逼的编程语言Java超越了所有咒骂它的“动态语言”Java的“继承人”没能超越它Java没有特别讨厌的地方结论程序员进阶方法

23840
来自专栏企鹅号快讯

如何掌握程序语言

学习程序语言是每个程序员的必经之路。可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必...

20090

扫码关注云+社区

领取腾讯云代金券