|  | 
 
| 
本帖最后由 不二如是 于 2019-1-27 16:22 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 
 
 学过编程的人,都会听过:
 
 
 那么请问,鱼油真的懂这两个概念吗?
 
 如果讲不出来个所以然,也不知从何说起,只能说:“你懂啦...”
 
 那么,推荐看一下这篇帖子。
 
 接下来,我们通过鱼油“自学《零基础入门学习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:所以程序猿永远都会有对象...):
 
 
 只要理解了我们上面找实体的属性和功能的基本操作后,“抽象、封装、继承、多态”,等概念都很好理解。
 
 
 
 
 简单总结
 
 回到一开始说的,二者并没有“你死我活”的对立之分,日常开发中往往同时存在。
 
 面向过程比较符合初学者的认知观,一步一步有顺序的抵达终点。
 
 面向对象则不会一上来就注重细节,而是关心实体的属性和功能。
 
 用最简单的话来解释就是:
 
 
 流水线 = 分解问题 + 逻辑为先 = 先细节,再整体。
 
 模块化 = 多态 + 继承 = 先抽象,后具体。
 
 最后想说的,二者也没有高下之分,一个精深,一个博大:
 
 精深:面向过程,思考到事物发展的每一步,细如发丝,考虑到任何一种可能发生的情况,一步步的执行,判断,直至事物的结束(深邃)。博大:面向对象的博大,将某一类事物的共同属性进行抽象,将其所有的属性,行为按功能集合。
 当然,当我们被项目经理催着上交项目时,不要再选择纠结了,哪个能让你更快的完成项目就用哪个吧!
 
 | 
 |