面向对象产生的过程

 

       我们每个人的电脑上都安装了很多程序,每一个程序都是为了满足人们的需要所设计出来的。这些程序是通过什么来编写出来的呢?当然是通过计算机来编写出来的。

       现实需求与程序是两种截然不同的概念,我们对计算机说我要这样那样的需求,计算机是没法根据我们的需求自动去满足我们的需求。那计算机到底是如何将现实的需求转为程序呢?

 

       计算机能识别的只有“0”和“1”组成的二进制语言,也就是机器语言。使用机器语言可想而知是非常痛苦的,于是人们进行了一次有益的改进:将一些底层机器特定的指令的二进制串用一些简洁的字母和符号来替代,这也就是汇编语言。汇编语言是对机器语言的轻微抽象,大大简化了程序的编写难度与易维护性,但同样汇编语言的本质仍是对机器硬件进行操作,所以汇编语言还有种叫法——伪机器语言。

 

       汇编语言虽然已经给编写程序带来了很大的改进,但由于其是直接控制计算机硬件,且简单的任务也需要很多的汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源,这样,就不可避免的加重了程序员的负担。与此同时,在程序调试时,一旦程序运行出了问题,就很难发现。

 

接着出现了许多所谓“命令式”语言(如Fortran、basic、C等)都是对汇编语言的抽象。Fortran之父尼古拉斯·沃思Niklaus Wirth)在Fortran中提出了结构化编程思想,结构化编程思想(面向过程)主要是将一个大的问题划分为几个小的问题,再将几个小的问题划分为更小的问题,我们解决大问题非常困难,但是解决划分后的最小的问题却比较容易。

并提出了一个著名的公式:

程序 = 数据结构 + 算法

这些语言在汇编语言的基础上进行了大幅度的改进,使得程序的编写进一步简单和易维护了。

 

结构化程序设计的基本原则是自上而下、逐步求精。按照程序所需实现的功能,将其划分为若干个关系简单、相对独立的模块;每一个模块内部都由三种基本程序结构——顺序结构、选择结构和循环结构组成。

结构化程序的优缺点

优点:分解程序设计的复杂性。

缺点:命名难以控制,程序不便于开发、维护,难以扩展。

总之,我们需要什么就在这个过程中加入什么,但是当需求改变了,我们又必须回到之前的整个过程中去修改,如果是较小的程序我们可能较容易去修改,但如果程序非常大呢?面向过程的思想对整个程序设计而言明显过于沉重了,我们很难将所有事情都计划的那么仔细,何况还存在未知的需求。

  

结构化编程的项目犹如一家小公司,小公司可能不分部门(对象),员工干事可能也比较杂(方法中的逻辑可能牵涉到许多方面),有时候一个员工还会被指派去做很复杂的事情(算法),因为人员较少(项目较小时),所以暂时不会暴露没什么问题,但当公司有员工流动就比较麻烦了(需求变动),少了谁公司的有些业务就不能运行(高度耦合,某些变动会对其他地方影响很大),突然加进来一个人又得让他去学习很多东西(增加需求则需前后连贯,较难插入新的成员),单个人员成本其实很高,而且领导(程序员)管理起来也比较累。

总之就是我给你一些基本资源(数据结构),你给我去好好干活吧(算法)。把我想要的结果给我就行。

  

      面向对象编程思想的核心:应对变化,提高复用。

面向对象编程思想主要是复用性和灵活性(弹性)。复用性是面向对象编程的一个主要机制。灵活性主要是应对变化的特性,因为客户的需求是不断改变的,怎样适应客户需求的变化,这是软件设计灵活性或者说是弹性的问题。

应用面向对象编程思想我们就不必在设计的最开始,就不必尽可能的去考虑到所有的细节,我们只需要将每个问题抽象出一个大体的概念——自定义类型。然后具体这个类里有什么行为和状态我们都可以暂时不用去为他花太多心思,即使后来改变了这方面的需求,我们也只需要去改变某些类,而不用去改变太多其他的地方。

 

       面向对象思想使得我们可以宏观去管理模块,而不用使所有的事情都放在一起干。

       运用面向对象思想来设计的项目犹如一家大型公司,公司已经划分了很多部门,每个部门(相比只有基本数据结构的面向过程这是个新的类型)同样有做事分工(不同的属性、方法),但他毕竟在同一个部门(一个对象里头),所以干的活没有天差地别,公司领导(程序员)需要做某些事情,只需要把事情告诉部门经理(给对象发送消息),然后由部门经理再去具体落实到谁去干(具体算法还是面向过程),但也不至于让财务部(类型A)里的员工去干销售部(类型B)的活,大大减轻了领导的负担。即使出现了人员流动(需求改变),也只需要让他熟悉某个部门的事就可以立马开始工作(易维护),对其他部门几乎没有什么影响(低耦合对其他代码没有太大影响),运用面向对象思想整个公司的运作会有条不紊。

 

 以下是计算机语言发展的过程中的部分语言。


 

最后引用知乎里的一些回答来区别面向过程与面向对象,以便更加鲜明的进行对比。

作者:杯酒酹江月
链接:https://www.zhihu.com/question/19701980/answer/22817355

面向过程&面向对象(角度改变观念)

a) 认识问题角度:面向过程,死物受规则被动操控;面向对象,活物主动交互。

b) 解决问题模块:面向过程,函数;面向对象,对象。

c) 解决问题中心角度:面向过程,Hwo,“如何做?”(流程封装为函数,“如何”就是过程,谁来做仅是参数);面向对象,Who,“谁来做?”(“谁”就是对象,如何做是他自己的操作,多个对象协同完成任务)。

d) 解决问题步骤角度:面向过程,先具体逻辑细节,后抽象问题整体;面向对象,先抽象问题整体,后具体逻辑细节。

e) 数传递角度:面向过程,参数或全局变量;面向对象,方法。

f) 关系角度:面向过程,找不到对象;面向对象,可找到过程。

g) 复用层次角度:面向过程,方法层复用;面向对象,对象层复用。

h) 新概念角度:面向过程,句柄;面向对象,构造&析构。