
1.1.2 面向对象与面向过程的区别
在面向对象的程序设计(Object Oriented Programming,OOP)方法出现之前,结构化程序设计占据着主流。结构化程序设计是一种自上而下的设计方法,通常指使用一个主函数来概括出整个程序需要做的事情,而主函数由一系列子函数所组成。对于主函数中的每一个子函数,又可以被分解为更小的子函数。结构化程序设计的思想就是把大的程序分解成具有层次结构的若干个模块,每个模块再分解为下一层模块,如此自顶向下、逐步细分,把复杂的大模块分解为许多功能单一的小模块。结构化程序设计的特征就是以函数(Function)或过程(Procedure)为中心,也就是以功能为中心来描述系统,用函数或过程来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。我们可以看出,结构化程序设计的优点是易于理解和掌握,但是这种模块化、结构化、自顶向下与逐步求精的设计原则有它的局限性,当任务明确、逻辑结构清晰而且需求变化相对较少时,结构化程序设计是可以胜任的。
然而,在比较复杂的问题或是在开发中需求变化比较多的情况下,结构化程序设计往往就显得力不从心。这是因为结构化程序设计是自上而下的,这要求设计者在一开始就要对需要解决的问题有一定的了解。在问题比较复杂的时候,要做到这一点会比较困难,而当开发中的需求发生变化时,以前对问题的理解也许会变得不再适用。事实上,开发一个系统的过程往往也是一个对系统不断了解和学习的过程,而结构化程序设计的方法忽略了这一点。另外,结构化程序设计的方法把密切相关、相互依赖的数据和对数据的操作相互分离了,这种实质上的依赖与形式上的分离使得大型程序的编写变得愈加困难,难于调试、维护和修改。在拥有多人进行协同开发的项目组中,程序员彼此之间很难读懂对方的代码,代码的重用变得十分困难。由于现代应用程序的规模越来越大,因而对代码的可重用性和易维护性的要求也越来越高,面向对象的程序设计技术对这些要求则提供了很好的支持。
面向对象的程序技术是一种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。从程序设计的方法上来说,它是一种自下而上的程序设计方法,它不像面向过程的程序设计那样一开始就需要使用一个主函数来概括出整个程序,面向对象的程序设计往往从问题的一部分着手,一点一点地构建出整个程序。面向对象的程序设计是以数据为中心,使用类(Class)作为表现数据的工具,类是划分程序的基本单位,而函数在面向对象的程序设计中成了类的接口。面向对象的程序设计这种以数据为中心而不是以功能为中心来描述系统的设计方法,相对来讲,使程序具有更好的稳定性。它将数据和对数据的操作封装到一起,作为一个整体进行处理,并且采用数据抽象和信息隐藏技术,最终被抽象成一种新的数据类型—类(Class)。类与类之间的联系以及类的重用性催生了类的继承、多态等特性。类的集成度越高,越适合大型应用程序的开发。另外,面向对象程序运行时的控制流程是由事件来驱动的,而不再由预先设定的顺序来引导程序的执行。事件驱动程序的运行机制以消息的产生与处理为核心,靠消息的循环机制来实现所谓事件驱动的执行方式。更为重要的是,我们可以在编程过程中采用不断成熟的各种框架(比如.NET的.NET Framework等),使用这些框架能够帮助我们迅速地将程序构建起来。面向对象的程序设计方法还能够使程序的结构清晰简单,极大地提高了代码的可重用性,有效地减少了程序维护的工作量,从而提高了软件的开发效率。
在结构上,面向对象的程序设计和结构化程序设计也有很大的不同。结构化的程序设计首先应该确定的是程序流程的走向,函数间的调用关系,函数间的依赖关系。一个主函数依赖于其子函数,这些子函数又依赖于更小的子函数,而在程序中,越小的函数往往是具体细节的实现,这些具体的实现又常常变化。于是,程序的核心逻辑依赖于外延的细节,程序中本来应该是比较稳定的核心逻辑,也因为依赖于易变化的部分而变得不稳定起来,一个细节上的小小改动也有可能在依赖关系上引发一系列变动。可以说这种依赖关系也是过程式程序设计不能很好应对需求变化的原因之一,而一个合理的依赖关系本应该是倒过来的,即细节的实现应该依赖于核心的逻辑。而面向对象的程序设计是由类的定义和类的使用这两个部分组成,主程序中定义对象并规定它们之间消息传递的方式,程序中的一切操作都是通过面向对象的消息发送机制来实现的。对象接收到消息后,启动消息处理函数完成相应的操作。
关于在程序实现上的不同,下面仍然以图书管理系统为例来说明,在使用结构化的程序设计时,首先需要在主函数中确定图书管理要做哪些事情,分别使用函数来“表述”这些事情,使用一个分支选择程序进行任务的选择,然后再将这些函数进行细化的实现,确定调用的流程等。而使用面向对象的程序技术来实现图书管理系统是,以图书管理系统中的学生为例,我们要了解图书管理系统中学生的主要属性,比如学号、院系等;学生会执行什么操作,比如借书、还书等,并且把这些数据及其操作当成一个整体来对待,形成一个类,即学生类。使用这个类,我们可以创建不同的学生实例,也就是创建许多具体的学生模型,每个学生拥有不同的学号,一些学生在不同的院系,他们都可以在图书馆借书和还书。学生类中的数据和操作都是可供应用程序进行共享的,我们可以在学生类的基础上派生出大学生类、大专生类、研究生类等,这样就可以实现代码的重用了。
类与对象是面向对象的程序设计中最基本和最重要的概念,也是创建和使用UML图的基础,必须仔细理解和掌握,并且在学习中不断强化和深入。