|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2019-1-27 16:22 编辑
学过编程的人,都会听过:
那么请问,鱼油真的懂这两个概念吗?
如果讲不出来个所以然,也不知从何说起,只能说:“你懂啦...”
那么,推荐看一下这篇帖子。
接下来,我们通过鱼油“自学《零基础入门学习Web开发》(HTML5 & CSS3)”的例子,来讲清楚这两个概念。
正式开始前,我们要达成一个共识:
面向过程:(procedure oriented programming 即:POP)
何为面向过程?
Wiki 定义:
主要采取程序调用(procedure call)或函数调用(function call)的方式来进行流程控制。流程则由包涵一系列运算步骤的程序(Procedures),例程(routines),子程序(subroutines), 方法(methods),或函数(functions)来控制。在程序运行的任何一个时间点,都可以调用某个特定的程序。任何一个特定的程序,也能被任意一个程序或是它自己本身调用。
通俗一些:
分析出解决问题所需要的步骤,然后用函数把这些步骤依次实现,然后依次调用。
回想一下,在我们的学习和工作中,试图去实现某项功能或完成某项任务时,是否会不自觉的列出完成步骤?
(如果没有,建议以后试着步骤化解决问题)
而当我们按着我们罗列的步骤去解决问题时,实质上就是按照面向过程的思想去解决问题。
我们罗列的步骤就是过程,按照步骤解决问题就是面向过程。
传统的面向过程的编程思想总结起来就八个字——自顶向下,逐步细化
实现步骤如下:
- 将要实现的功能描述为一个从开始到结束的连续的步骤(过程);
- 依次逐步完成这些步骤,如果某一步的难度较大,又可以将该步骤再次细化为若干个子步骤,以此类推,一直到结束得到想要的结果;
- 程序的主体是函数,一个函数就是一个封装起来的模块,可以实现一定的功能,各个子步骤往往就是通过各个函数来完成的,从而实现代码的重用和模块化编程;
说了这么多,我们来点实际案例,通过流程图来模拟自学的步骤(不唯一):
通过流程图我们依次分析好了学习的步骤,接下来就是按部就班执行了。
所以面向过程,就真的是面向过程,一旦过程设计好,代码实现就好说啦。
面向对象:(object oriented programming 即:OOP)
何为面向对象?
Wiki 定义:
具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象
通俗一些:
编程的时候尽可能的去模拟真实的现实世界,按照现实世界中的逻辑去处理一个问题,分析问题中参与其中的有哪些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的属性和方法去解决问题。
在咱们的真实世界中,,任何一个操作或者是业务逻辑的实现都需要一个实体来完成。
也就是说,实体就是动作的支配者,没有实体,就肯定没有动作发生。
让我们看看上面流程图中有哪些动词:
有动词就一定有实现这个动作的实体。
所谓的模拟现实世界,就是通过计算机语言编程来解决相关业务逻辑,并且和真实的业务逻辑的保持一致。
需要使每一个动作的背后都一个完成这个动作的实体。
因为任何功能的实现都是依赖于一个具体的实体的“动作”。
这可以看作是一个又一个的实体在发挥其各自的“能力”并在内部进行协调有序的调用过程。
当采用面向对象的思想解决问题时,可分为下面几步:
- 分析哪些动作是由哪些实体发出的;
- 定义这些实体,为其增加相应的属性和功能;
- 让实体去执行相应的功能或动作;
采用面向对象的思想,解决自学问题,大体上也有如下步骤。
第一步:找出实体和对应的动作。
大体可分为:
- 小甲鱼录制好教程
- 鱼油自愿买教材
- 鱼油学习视频
- 鱼C论坛提供学习支持
- 鱼油提问
- 大神提供支持
于是,在整个过程中,一共有四个实体:
在现实中的一个具体的实体,就是计算机编程中的一个对象。
第二步:定义这些实体,为其增加相应的属性和功能
属性性就是实体在现实世界中的一些特征表现。
例如:
猫的属性:名字、性别、品种等
手机的属性:品牌、价格、尺寸、芯片等
功能就是能完成的动作,在面向对象的术语中,动作就叫作方法或者函数。
例如:
猫的功能(动作):吃饭、睡觉、晒太阳、卖萌等
手机的功能(动作):打电话、发短信、拍照、打游戏、视频、看电影等
然后可以将属性和功能整合到一起,变为一张可视化的图片:
现在我们将例子中的4个实体(小甲鱼、鱼C论坛、鱼油、大神)的属性和功能,画成上面的图。
小甲鱼:
鱼C论坛:
鱼油:
大神:
属性并不唯一,上面例子中只列出最具代表性的值。
第三步:让实体去执行相应的功能
- 小甲鱼完成教程的录制并发布,配套教程变为实体书供有需要的鱼油食用。
- 鱼油按照需要自学相应的教程,如有问题去论坛相应板块提问。
- 鱼C论坛运行良好,为广大鱼油学习保驾护航。
- 论坛上大神看到鱼油提问,进行热心解答。
所以说,面向对象主要针对功能,实质上可以理解为“面向实体”,所以经常听到老鸟们说(PS:所以程序猿永远都会有对象...):
只要理解了我们上面找实体的属性和功能的基本操作后,“抽象、封装、继承、多态”,等概念都很好理解。
简单总结
回到一开始说的,二者并没有“你死我活”的对立之分,日常开发中往往同时存在。
面向过程比较符合初学者的认知观,一步一步有顺序的抵达终点。
面向对象则不会一上来就注重细节,而是关心实体的属性和功能。
用最简单的话来解释就是:
流水线 = 分解问题 + 逻辑为先 = 先细节,再整体。
模块化 = 多态 + 继承 = 先抽象,后具体。
最后想说的,二者也没有高下之分,一个精深,一个博大:
精深:面向过程,思考到事物发展的每一步,细如发丝,考虑到任何一种可能发生的情况,一步步的执行,判断,直至事物的结束(深邃)。
博大:面向对象的博大,将某一类事物的共同属性进行抽象,将其所有的属性,行为按功能集合。
当然,当我们被项目经理催着上交项目时,不要再选择纠结了,哪个能让你更快的完成项目就用哪个吧!
|
|