日期:2011-10-11  浏览次数:20458 次

  导读:过程式编程和面向对象编程的区别并不在于是否使用函数或者类,也就是说用到类或对象的可能是过程式编程,只用函数而没有类的也可能是面向对象编程。那么他们的区别又在哪儿呢?

  过程式编程

  维基百科是这样定义过程式编程的(Procedural Programming):过程式编程某种意义上等同于命令式编程(为了达到预定的状态而执行指定的步骤)的同义词,同时也是一种编程范例(正如本文中所述)——由结构化编程衍生而来,遵循过程调用的观念。

  这是一个很恰当的定义,但我们还可以改进它。我更赞同“过程式编程只是一系列为了实现需求功能的特定步骤的命令”这一观点。它究竟是如何实现的只是细节,与范例无关,重要的是它是工作所必要的。先来看几个例子:

  这个很明显是过程式编程:

 

  $m = mysqli_connect(...);

  $res = mysqli_query($m, $query);

  $results = array();

  while ($row = mysqli_fetch_assoc($res)) {

  $results[] = $row;

  }

 

  虽然用到了对象,但它实际上也是过程式编程:

 

  $m = new MySQLi(...);

  $res = $m->query($query);

  $results = array();

  while ($row = $m->fetch_assoc($res)) {

  $results[] = $row;

  }

 

  即使使用了类,它还是过程式编程:

 

  class GetResults {

  public function getResults() {

  $m = new MySQLi(...);

  $res = $m->query($query);

  $results = array();

  while ($row = $m->fetch_assoc($res)) {

  $results[] = $row;

  }

  return $results;

  }

  }

 

  注意:上述几个例子使用了完全相同的代码框,它们之间的不同点在于如何实现的,但都是过程式编程,都包含必须的独立步骤。再来看看什么才是面向对象编程,它们之间的不同之处又在哪?

 

  面向对象编程

  维基百科上是这样定义面向对象编程(Object-Oriented Programming)的:面向对象编程是使用对象的编程范式——包含数据域、方法以及它们之间的交互——来设计应用和程序。编程技术包括包括数据抽象、封装、通信、模块化、多态和继承。

  这个定义也不错,但我只同意它的第二部分。第一部分所说的“必须使用对象来做面向对象编程”很明显是错误的,你完全可以通过数据抽象、封装、通信、模块化、多态和继承等方式实现数据抽象。

  我对于面向对象编程的几点理解是:

  首先,它必须将数据抽象为模块结构;

  其次,必须存在某种方式来实现代码的多态执行;

  最后,它至少能部分压缩代码和函数。

  下面再看看几个例子:

  经典面向对象编程模式:

 

  class Mediator {

  protected $events = array();

  public function attach($eventName, $callback) {

  if (!isset($this->events[$eventName])) {

  $this->events[$eventName] = array();

  }

  $this->events[$eventName][] = $callback;

  }

  public function trigger($eventName, $data = null) {

  foreach ($this->events[$eventName] as $callback) {

  $callback($eventName, $data);

  }