我所理解的面向过程与面向对象
在大学的计算机系中,最常被拿出来讨论的一个问题,也是大学生上Java语言基础课所要面对的第一个问题,就是面向过程与面向对象的区别。但这些关于这两种思想的讨论往往最后会演变成C与Java区别的讨论或者C与C++区别的讨论。
在程序里,面向过程是通过一个个函数之间的相互调用完成的,面向对象是利用编程语言提供的类、接口、继承、封装、多态等特性体现的。所以人们总是把面向过程与C语言联系起来,把面向对象与Java等语言联系起来。
诚然,C语言的特性导致了它更适合面向过程编程,而Java或者C++的特性导致了它们更适合面向对象编程。然而这些并不是这两种编程思想的真正区别。用C语言照样可以实现面向对象,用Java或者C++照样可以面向过程编程,语言往往不是这类问题的关键。
面向过程和面向对象,是两种不同的编程思想。既然是思想,那么它就影响了人们解决问题的思考方式。假如我想吃个汉堡。面向过程就是烤面包片->烤肉->涂酱料->切菜->拼装等一系列动作,每次想吃汉堡我都会这么做,因为汉堡的制造过程就是如此。而使用面向对象,我会在想吃汉堡的时候直接去找一家肯德基。
面向过程意味着解决问题的时候先将问题分解为过程,再通过完成一个个过程达到最终的目标,它直观,非常符合人们正常的思考方式。而面向对象则需要先对问题进行抽象,得到问题的抽象结构,再通过对象之间的相互作用解决问题。
很多人往往还有另一种错误的想法:面向对象优于面向过程。这又是编程语言惹的祸!那些被C语言坑惨了的学生,习惯性地把Java程序更好写归功于面向对象而不是GC。我的态度是:编程思想并没有优劣之分。选用什么思想构建程序,往往取决于问题的复杂程度、抽象程度、程序的规模和运行时间。
面向过程更适合那些简单的问题。面向对象则适合抽象程度更高的问题。假如只是临时地想计算一下某个公式,没必要专门抽象出一个公式类。想构建一个web页面,则没必要控制整个程序运行的每一步…
有趣的是,有时候这两种思想是同时存在于同一个程序中的。
最后需要说明的一点是:编程思想跟编程语言一样,只是一个工具,只是为了更好地编写优质、易读、易维护、低耦合度的代码。如果被思想缚住了手脚,那就得不偿失了。