不二如是 发表于 2019-1-22 15:30:25

面向对象和面向过程你真的懂吗?

本帖最后由 不二如是 于 2019-1-27 16:22 编辑



学过编程的人,都会听过:
面向对象和面向过程

那么请问,鱼油真的懂这两个概念吗?

如果讲不出来个所以然,也不知从何说起,只能说:“你懂啦...”

那么,推荐看一下这篇帖子。

接下来,我们通过鱼油“自学《零基础入门学习Web开发》(HTML5 & CSS3)”的例子,来讲清楚这两个概念。



正式开始前,我们要达成一个共识:
**** Hidden Message *****



面向过程:(procedure oriented programming 即:POP)

何为面向过程?

Wiki 定义:
主要采取程序调用(procedure call)或函数调用(function call)的方式来进行流程控制。流程则由包涵一系列运算步骤的程序(Procedures),例程(routines),子程序(subroutines), 方法(methods),或函数(functions)来控制。在程序运行的任何一个时间点,都可以调用某个特定的程序。任何一个特定的程序,也能被任意一个程序或是它自己本身调用。

通俗一些:
分析出解决问题所需要的步骤,然后用函数把这些步骤依次实现,然后依次调用。

回想一下,在我们的学习和工作中,试图去实现某项功能或完成某项任务时,是否会不自觉的列出完成步骤?
(如果没有,建议以后试着步骤化解决问题)

而当我们按着我们罗列的步骤去解决问题时,实质上就是按照面向过程的思想去解决问题。

我们罗列的步骤就是过程,按照步骤解决问题就是面向过程。

传统的面向过程的编程思想总结起来就八个字——自顶向下,逐步细化

实现步骤如下:

[*]将要实现的功能描述为一个从开始到结束的连续的步骤(过程);
[*]依次逐步完成这些步骤,如果某一步的难度较大,又可以将该步骤再次细化为若干个子步骤,以此类推,一直到结束得到想要的结果;
[*]程序的主体是函数,一个函数就是一个封装起来的模块,可以实现一定的功能,各个子步骤往往就是通过各个函数来完成的,从而实现代码的重用和模块化编程;


说了这么多,我们来点实际案例,通过流程图来模拟自学的步骤(不唯一):


通过流程图我们依次分析好了学习的步骤,接下来就是按部就班执行了。

所以面向过程,就真的是面向过程,一旦过程设计好,代码实现就好说啦。



面向对象:(object oriented programming 即:OOP)

何为面向对象?

Wiki 定义:
具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象

通俗一些:
编程的时候尽可能的去模拟真实的现实世界,按照现实世界中的逻辑去处理一个问题,分析问题中参与其中的有哪些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的属性和方法去解决问题。

在咱们的真实世界中,,任何一个操作或者是业务逻辑的实现都需要一个实体来完成。

也就是说,实体就是动作的支配者,没有实体,就肯定没有动作发生。

让我们看看上面流程图中有哪些动词:
购买、观看、完成、提问、学习

有动词就一定有实现这个动作的实体。

所谓的模拟现实世界,就是通过计算机语言编程来解决相关业务逻辑,并且和真实的业务逻辑的保持一致。

需要使每一个动作的背后都一个完成这个动作的实体。

因为任何功能的实现都是依赖于一个具体的实体的“动作”。

这可以看作是一个又一个的实体在发挥其各自的“能力”并在内部进行协调有序的调用过程。

当采用面向对象的思想解决问题时,可分为下面几步:

[*]分析哪些动作是由哪些实体发出的;
[*]定义这些实体,为其增加相应的属性和功能;
[*]让实体去执行相应的功能或动作;


采用面向对象的思想,解决自学问题,大体上也有如下步骤。

第一步:找出实体和对应的动作。

大体可分为:

[*]小甲鱼录制好教程
[*]鱼油自愿买教材
[*]鱼油学习视频
[*]鱼C论坛提供学习支持
[*]鱼油提问
[*]大神提供支持


于是,在整个过程中,一共有四个实体:
小甲鱼、鱼C论坛、鱼油、大神

在现实中的一个具体的实体,就是计算机编程中的一个对象。

第二步:定义这些实体,为其增加相应的属性和功能

属性性就是实体在现实世界中的一些特征表现。

例如:
猫的属性:名字、性别、品种等
手机的属性:品牌、价格、尺寸、芯片等

功能就是能完成的动作,在面向对象的术语中,动作就叫作方法或者函数。

例如:
猫的功能(动作):吃饭、睡觉、晒太阳、卖萌等
手机的功能(动作):打电话、发短信、拍照、打游戏、视频、看电影等

然后可以将属性和功能整合到一起,变为一张可视化的图片:


现在我们将例子中的4个实体(小甲鱼、鱼C论坛、鱼油、大神)的属性和功能,画成上面的图。

小甲鱼:


鱼C论坛:


鱼油:


大神:


属性并不唯一,上面例子中只列出最具代表性的值。

第三步:让实体去执行相应的功能

[*]小甲鱼完成教程的录制并发布,配套教程变为实体书供有需要的鱼油食用。
[*]鱼油按照需要自学相应的教程,如有问题去论坛相应板块提问。
[*]鱼C论坛运行良好,为广大鱼油学习保驾护航。
[*]论坛上大神看到鱼油提问,进行热心解答。


所以说,面向对象主要针对功能,实质上可以理解为“面向实体”,所以经常听到老鸟们说(PS:所以程序猿永远都会有对象...):
万物皆对象。

只要理解了我们上面找实体的属性和功能的基本操作后,“抽象、封装、继承、多态”,等概念都很好理解。



简单总结

回到一开始说的,二者并没有“你死我活”的对立之分,日常开发中往往同时存在。

面向过程比较符合初学者的认知观,一步一步有顺序的抵达终点。

面向对象则不会一上来就注重细节,而是关心实体的属性和功能。

用最简单的话来解释就是:
面向过程:流水线
面向对象:模块化

流水线 = 分解问题 + 逻辑为先 = 先细节,再整体。

模块化 = 多态 + 继承 = 先抽象,后具体。

最后想说的,二者也没有高下之分,一个精深,一个博大:
精深:面向过程,思考到事物发展的每一步,细如发丝,考虑到任何一种可能发生的情况,一步步的执行,判断,直至事物的结束(深邃)。
博大:面向对象的博大,将某一类事物的共同属性进行抽象,将其所有的属性,行为按功能集合。

当然,当我们被项目经理催着上交项目时,不要再选择纠结了,哪个能让你更快的完成项目就用哪个吧!

sorrybro 发表于 2019-2-20 11:07:49

e

逆鳞丶樱之羽 发表于 2019-3-3 16:59:21

学习学习

bcy20190117 发表于 2019-4-10 10:20:41

6666

大头目 发表于 2019-5-5 14:27:59

学习~~~~~~~

q1103139787 发表于 2019-5-18 21:04:19

查看

毛绒绒 发表于 2019-6-14 08:25:18

{:10_277:}

982645331 发表于 2019-6-22 15:31:59

进来学习

YANG20150822 发表于 2019-6-25 14:15:59

a

Qmh 发表于 2019-7-16 21:28:41

{:10_257:}

chordblue 发表于 2019-8-9 14:12:37

学到类和对象这有点晕了,学习学习。

ZZBZZB0510 发表于 2019-9-18 11:51:03


学习学习

compiler 发表于 2019-9-21 13:54:51

面向对象和面向过程你真的懂吗?

qiangcom 发表于 2019-10-2 06:18:40

嘻嘻嘻

小龙123 发表于 2019-10-10 08:23:49

fRanKen_fRanKen 发表于 2020-3-8 09:30:30

棒棒棒

hereeisdavid 发表于 2020-9-23 10:05:07

真想知道

憨憨先生 发表于 2020-9-29 16:55:45

我来看看

老周12138 发表于 2020-10-22 12:04:46

蟹蟹

jinhuaedu 发表于 2020-11-25 14:19:54

有共识,学习来了
页: [1]
查看完整版本: 面向对象和面向过程你真的懂吗?