关于写《面向过程和面向对象的编程》这个话题我很矛盾,我担心许多程序员对此话题不太感兴趣,可能他们不太懂得面向过程和面向对象编程的巨大差距,以及对编程水平的影响。
在我整个编程生涯中,有无数的转变和变化让我铭记在心。从汇编到C语言,从文件系统到数据库,从C语言倒Dbase,从C/S倒B/S,从程序语言倒开发平台等等。但是,让我感觉最大的、最根本的转变是从C语言转学C++。可以说这是一个革命性的转变。在当时我对C语言的运用已经如日中天,得心应手,感到只要用C语言就能完成所有应用程序的开发。但是,学了C++之后,我才恍然大悟,程序还可以用另外一种思维编写。这个转变过程极其痛苦,每个概念的接受都需要和C语言进行对比,都要不停地问这个是为什么?整整花了我几乎半年时间,而且每分每秒让你在不解,忽然懂了,忽然不懂中度过。我学习一种语言,主要是学习这个语言的构架和基本原理,也就是说要研究这个语言的由来和特点。又经过若干年后,我才真正意识到面向对象编程的重要意义。它绝对是程序员思维方式的变革和升华,它使得程序员可以从具体编程,提升到抽象的结构。使得程序员可以编写更加通用的类,进而编写通用的软件产品。
人们从小就学习1、2、3、4,头脑里排满了次序!绝大数人都是按照次序思维的。这种次序就是一种过程。例如先做什么,后做什么。做得比较好的,表现做事有条理,做事很有逻辑性。做得不好的,则把过程做得歪歪扭扭最后也能达到预期的结果。同样,绝大多数程序员都是按照面向过程思维方式去编程的。尽管他们用了面向对象的程序设计语言,学了对象、学了类,用了类,但是他们仍然用面向过程的方式编程。
一、面向过程编程
面向过程编程体现了程序员的逻辑性,许多程序员的水平就体现在这里。如何设计语句的次序,如何组织函数、如何设计函数的参数、如何设计过程分支等等都体现了程序员的逻辑能力。例如,我们编写保存学生信息功能:
1) 空值处理
我们首先要判断学生信息项是否有空值,如必输项为空,则给出提示。例如,学生姓名为空!
2) 合法性检查
然后,我们还要对各信息项的有效性进行判别,如果有无效信息提示重新输入。例如,如学生的出生日期不符合日期格式!
3) 产生学生ID
可以给出自然数,也可以给出有意义的编码!但是ID必须是唯一的!如不唯一则进行相应的处理。
4) 打开数据库
建立数据库连接,获取数据库句柄。
5) 组织insert 语句
将操作者输入的学生信息,拼成一句insert语句!(实现这个功能有很多种方法)
6) 提交数据库运行
将insert语句提交给数据库。
7) 操作日记
将以上操作信息写入日记。
8) 提示写入成功
提示“保存成功!”向操作者提示操作成功!
这些是我很随意给出的保存学生信息的过程。当然,不同的程序员可能会写出不同的过程,但是最终的结果是,学生信息保存到数据库中。
处理的内容越多,不同程序员处理逻辑越是不同。可谓五花八门,而正是这些不同,体现了程序员的水平。
但是,这种面向过程的编程的程序只能用于具体的系统,却不能用于其它系统。例如,以上的程序只能用于学生信息处理程序。
二、面向对象编程
面向对象编程体现了程序员的抽象能力,其本质是把一个事物或多个事物看作一个抽象的对象。还是举例,保存学生信息功能。
1) 我们可以把保存学生信息功能看成一个对象(这里仅是举例,不一定合理。)
注意我们这里先不要管面向过程中的那些处理流程,仅仅把它当作一个对象,一个空集。
2) 我们为这个对象设计设计属性
例如,输入信息、数据库连接串、数据表名、日记表名等!
3) 我们为这个对象设计事件。
处理
4) 我们编写这个类。
5) 我们在保存功能的命令按钮里调用这个类
用面向对象编程思想与面向过程编程是不同的,它把学生信息抽象成输入信息,把学生信息表抽象成数据表。基本上于我们所要编写的具体学生信息无关。这种抽象使得编写的类,有可能用于学生信息处理、客户信息处理、员工信息处理、人口信息处理中的信息保存功能。。。
我并不是说面向过程不好,因为,绝大多数程序是面向过程的,许多程序员面向过程的逻辑性能力还有待提高,因此,程序员还需要从基础做起,提高面向过程编程的水平;以我的经验和体会,能够把面向过程的程序编好也不是很容易的事!新手首先要学会面向过程编程,有经验的程序员要提高面向过程的编程的水平。而系统的结构、模块的结构、功能的结构、函数的结构、控件的结构都应该用面向对象的思维进行设计。但是总体上来说,从面向过程编程到面向对象编程是个思维方式提升的过程,作为程序员应该对此有一个清醒的认识,而这一点正是优秀程序员必需具备的条件之一。当一个程序员能从具体的程序抽象出对象,并能把这个对象用于其它程序,则这个程序员完成了技术水平的蜕变,跻身于优秀程序员行列了。
下篇:《漫谈程序的效率和水平》