面向过程和面向对象的计算机编程

  categories:儿童计算机  author:

本文是 从锦囊妙计联想到的16集, 从本集开始 要开始些实用的东西, 然后在分享一下 使用的视频教程, 参照这些教程可以进行简单的计算机的入门等操作了。

前面的加上本集, 大概一共15集 , 主要是说明了一下计算机基本上都工作原理, 由于本人水平有限, 也未必都是正确的, 仅仅是给初学者提供一个帮助。前面通过各种例子试图说明 计算机就是执行程序的一个 机器, 他的执行必须依赖指令, 而指令其实就相当于锦囊一样。

 下面的一段文字内容很重要, 要仔细瞧

     计算机程序复杂到一定程度后, 就会有大量的锦囊(指令的存在), 而锦囊多到一定程度后, 就很难管理了,这个时候, 我们就需要根据各个锦囊的相关程度和特点以及一些执行顺序把这些锦囊要分类打包到一个大的锦囊中去。然后别人才好使用。

现在的问题是当问题复杂到一定程度后, 这个负责打包的人负责整理的人能否完整的考虑清楚 每个分类, 每个打包的情况吗? 这个是非常重要的问题。

先放下这个问题, 先仔细看看 常见的解决问题的过程, 看看是否能解决上述的问题。

一。基于过程,基于函数,面向过程

上面的几个说法基本上没什么特别大的区别, 基本是一样就像谁能说出老鼠同耗子的区别, 反正我不知道有什么区别。

1. 编写程序的需要达到的要求

前面不止一次说过了, 计算机是个傻东西, 你如何告诉他, 他就如何做, 因此, 编写程序时, 编写程序的人必须 准确的知道 如何准确的做一件事情时,才能 编写出程序, 才能告诉计算机如何去做, 然后计算机才能去工作。

试想, 前面若是关羽本身不知道 如何烙饼, 如何去写烙饼的锦囊? 因此他必须熟悉这些事情, 然后才能去写。

当然一种情况是 关羽乱写一通, 。。。 这个情况应该不在讨论之列。

传统上,编写程序的人,必须了解要写的程序是如何工作, 否则写的东西应该是有问题的。

2. 编写程序要注意的一些异常情况

前面说了编写程序的人要完全知道程序是如何工作的, 然后才能做好这个事情, 其实这个是个必须的条件, 但是不能确保它一定成功。 为什么? 因为现实生活中或者计算机中有很多你事先没有想到的事情, 比如突然没有面了, 突然没有油了。。。

这些特殊的情况你要都有想到, 然后给出相应的解决办法, 这样执行这个程序(锦囊的)人才能做好这些事情。可以了解到写好一个程序还是非常有挑战的。

3. 合理控制规模, 常用的功能封装到一起

若是一个程序本身很复杂, 那么就会有很多的锦囊(指令), 同时执行时还有大量的要考虑的特殊情况等, 因此直接处理这些问题就非常麻烦了。

因此常用的办法是按照一定的 功能组合这些程序到一起,然后打个包, 打好包的程序一般叫做函数, 或者过程, 或者子程序等等,这个函数或者过程可以被其他程序直接使用(就是调用),这样就方便了, 管理方便,使用方便。

因此对于一个程序员 最大的挑战是 一开始如何分析一个 特别复杂的程序的各种情况, 和各种特殊情况(就是不正常情况), 然后将它们如何划分为各个子程序的过程。 这个分析过程通常叫做系统分析

这个分析问题, 然后划分为各个子程序的过程的  开发方法就是 面向过程, 你也可以叫 面向函数, 或者面向子程序。 但是通常叫法就是面向过程, 大家都这么叫 顺溜了。

准确说包括:  面向过程的分析, 面向过程的设计, 面向过程的开发主要三个阶段。

为什么 取名面向过程。  面向, 简单理解就是朝向, 面对, 由于面对的是一堆函数或者过程, 因此, 就叫做面向过程了(个人理解)。

5. 面向过程的分析

没错跳过了一个编号

这个过程核心是分析, 不是去做一个事情, 其实就是一堆人在一起七嘴八舌的讨论一件事情, 通过这些讨论要弄明白一个事情是如何发生, 如何能解决,大概谁去做, 如何做等的  具体的讨论工作, 强调一下是讨论工作, 讨论是这个阶段的 主要特征, 当然可能讨论过程中可能要记录一下讨论的结果等 ,避免白白浪费时间。

6. 面向过程的设计

到底什么是设计?  简单说一下, 我们做一个简单的事情,自然要直接做就好, 例如做个一个 简易的狗窝, 自然拿来木头, 相关材料, 钉子,锤子等工具就做, 大不了, 做坏了, 从新来过。

但是盖一个摩天大楼, 这么干就不行, 不能说盖一半了, 不好拆了从新来, 那成本太高了。 因此在做一件大的事情时, 都会事先规划好, 然后找专门人员绘制图纸, 然后讨论这些图纸的可行性, 分析需要多少钱, 多少时间, 多少人, 分析各种风险等等, 这些事情都是在没有具体的工作前的一些理论上, 丰富的,大量的非常具体的讨论工作了, 这个过程一般就是设计, 其实更准确说是建模。 这里粗浅认为是设计了。

在写程序时也存在这么一个过程就是设计工作, 同上面盖摩天大楼一杨就是充分讨论, 绘制各种类似图纸的东西(流程图等), 然后大家讨论, 研究可行性等。

上面的过程由于是研究程序如何划分为多少个子过程(函数)因此叫做面向过程的分析。

7. 面向过程的开发

有了前面的面向过程的分析后, 就可以进行面向过程的设计了, 有了面向过程的设计后, 就可以根据设计结果进行开发了。

在通过面向过程的设计后, 根据设计结果开发一个一个的函数或者过程, 然后最后将这些过程或者函数拼装到一起完成一个 完整的功能的过程就是一个典型的 面向过程的开发过程。

8. 面向过程的特点

面向过程的分析、设计、开发的方法, 在计算机程序早期开发中起到了很大的作用, 早期计算机程序相对简单, 也没有很多的异常情况等, 因此面向过程的一套东西非常成功。

他提供了一套标准的工作流程, 让各个工作环节能衔接起来。

并且随着面向过程的应用的增加, 大量的函数或者过程的被使用, 人们慢慢发现有很多通用的东西可以集成到一起, 以后可以被反复的调用, 因此人们就考虑到采用一个仓库把函数或者过程储存起来, 然后使用时仅仅需要打开仓库, 就可以用里面的函数了!

因此有了函数库的概念, 函数库, 就是把常用的函数集成到一起, 然后把它们打包, 供别人使用。 有人专门开发这些函数库, 然后像使用这些函数库的人收费。

这些函数库,也可以有一些使用方法、使用规程、使用条件, 总之这些做好的函数可以可以 极大的帮助人们开发 自己的程序。 他们不需要 每个事情都从头开发了。

通常把很多函数库都打包在一起, 在配合一些别的必要的 东西, 这些东西都能提高开发程序的效率。 因此这些东西(主要是函数库) 通常叫做 软件开发辅助工具, sdk (soft 软件, d 开发的缩写, k 辅助工具的缩写)。其实sdk包括很多东西, 后面马上要讨论 面向对象的技术, 里面有很多sdk。

sdk就是各个能帮助大家开发软件(就是程序)的 工具集合或者全体。

9. 面向过程的挑战或者问题

  • 面向过程的工作, 最大的一个问题, 是当软件的工作规模非常大的时候, 需要一个非常了解这个系统的一些人,来彻底的了解要解决的全部问题等等, 若是没办法解决这个问题, 就开始工作, 造成后面有很多没有考虑到的事情出现, 那么那些写好的函数、过程等等, 都会发生变化, 因此造成经常变换, 经常重复劳动。
  • 随着游戏的发展, 很多游戏地图无限大, 你走到哪里都不会到头, 人物无限多, 你到哪里都有人, 这些都是没有上限的, 这个情况下要 有一个人 有能力理解全部的程序, 绘制全部的工作流程是非常困难的, 因此这个时候,面向过程的办法有点不灵了。

如何解决上述问题?  面向对象慢慢出来了!

二。 面向对象的软件思想

1. 面向对象和面向过程的思想的差异

前面面向过程的思想是,把任何需要计算机解决的问题的全部过程都分析清楚, 然后在规划一定的函数等。 这个过程同现实生活不太一样。

考虑一下下面场景

去街边小摊吃煎饼果子, 你需要是准备好钱, 然后找到老板, 通知他需求, 然后他就工作了, 他工作过程中, 各种事情, 同你有关系吗? 你需要他怎么工作的吗? 你需要看他用多大锅, 多少面粉, 多少水?等等细节吗? 这些你都不需要!

若是面向过程的就不行了, 你必须 写清楚一个个的锦囊, 上面的事情都需要掌握,你才能写好锦囊的, 这个就有难度了!  因此面向过程的 开发思想同现实生活有了脱节的地方。必须想办法修改它, 改造他, 使用现实。

2. 面向对象的委托工作方式

生活中我们采用的是委托工作的方式进行的, 例如上面场景,需要一个煎饼果子,其实是我们委托老板去做, 然后我们支付一定的委托费而进行的。好处是专业的人员做专业的事情, 我们不需要关心人家的细节。 这个非常重要。

那么如何委托一个别人去做一件事情,  我们需要先找到这个人, 然后通知他。

这个被委托的或者是煎饼果子的老板是如何来的, 他是否给一个人服务等等?

显然在计算机程序中, 煎饼果子老板也是一个程序, 也是程序员编写的, 但是 有可能是一个真正明白 做煎饼果子的程序员写好的, 然后别人拿来就用就好了。

这样通过委托工作的方式, 可以大大节省开发程序员的工作量,开发程序的人仅仅需要知道自己的事情, 不需要知道他不熟悉的事情(开发程序员, 可能不是一个煎饼果子的专家, 但是他仅仅需要一个煎饼果子),这样简化了开发过程。

3. 面向对象的思想过程

总结一下上述过程, 在面向过程的中, 程序员仅仅需要关心自己的事情, 当他需要其他功能时, 仅仅需要找到合适的能为他服务的人(计算机里面的术语是 对象实例), 然后通知这个人进行相关工作。
找到合适的人的过程是个需要解决的事情。有多种方式, 可以从别处获取一个, 也可以自己找一个全新的(就是创建一个), 用完了就归还人家。

5. 标准对象,抽象一类对象,对象实例

其实从别处找到的也是别人实现安排好的, 然后给你用一下, 用完你要归还的。

这些创建工作, 可以参照如下过程。 开发人员做一个标准的煎饼果子的人, 当有其他需要制作煎饼果子的人时, 专门的管理人员从那个已经做好的人上做一个复制, 就可以做出一个完全一样东西。这个过程叫做实例化。那个标准的人其实就是模具。 准确说这些类似的人和东西构成了一类东西。

从一个实现做好的东西或者一个类型中复制(或者创造)出一个东西,这个东西是为我们服务的东西的过程, 叫做对象的实例化。

这些可以用来实例化别的东西的  一些程序或者东西, 其实就是一类型, 一个由特定程序员开发的一个特定类型的东西, 这个类型就是简称类, 英文class

6. 面向对象的应用

面向对象的应用已经非常广泛了, 由于面向对象编程中, 程序员仅仅关系自己要解决的问题,其他的问题都可以交给其他专业人员解决, 大大降低了对程序员的要求, 因此现在大部分的程序都是面向对象的程序了。

还是, 列举一个例子为好。前面的那个无限场景, 无限人物的例子说明如何面向对象比较好的解决问题。

首先我们需要一个场景对象, 给他个名称  CJ, 他代表游戏中的地图等等。 那么其他人的 全部场景相关的东西都仅仅需要委托给这个CJ对象,不在需要自己关心是多大地图, 多大。。。 各种东西了。

然后我们需要一个 人物对象, 命名为 RW , 这里提供全部人物相关的功能等等

最后我们需要一个 玩家 对象  , 命名为 WJ对象, 然后就可以像下面这样了。

WJ 进入 CJ, 然后CJ工作显示信息给WJ(这个过程不需要玩家做任何东西, 或者不需要开发玩家的程序员考虑场景相关的具体东西了), 然后WJ获取这个场景中的RW信息, 在这个CJ中同RW进行各种活动等等。 有了CJ对象后  玩家的开发者 从具体的 地图等地方解放了, 不要他关心了。

当WJ,从一个世界, 转换到另外一个世界是, 其实更换的是CJ的对象, 其他的WJ的工作都是不变的,或者自动适应了。

 

其实面向对象有很多很多的优点, 这里仅仅开了个头, 慢慢后面在说。

 



快乐成长 每天进步一点点      京ICP备18032580号-1