设计模式之美学习(四):面向对象相比面向过程有哪些优点?面向过程真的过期了吗?

除了面向对象以外,被你们熟知的编程范式还有另外两种,面向过程编程和函数式编程。面向过程这种编程范式随着面向对象的出现,已经慢慢退出了舞台,而函数式编程目前尚未被普遍接受。编程

在工做中,不少人搞不清楚面向对象和面向过程的区别,总觉得使用面向对象编程语言来作开发,就是在进行面向对象编程了。而实际上,他们只是在用面向对象编程语言,编写面向过程风格的代码而已,并无发挥面向对象编程的优点。这就至关于手握一把屠龙刀,却只是把它看成一把普通的刀剑来用,至关惋惜。小程序

什么是面向过程编程与面向过程编程语言?

咱们能够对比着面向对象编程和面向对象编程语言这两个概念,来理解面向过程编程和面向过程编程语言。还记得以前是如何定义面向对象编程和面向对象编程语言的吗?让咱们一块再来回顾一下。数据结构

  • 面向对象编程是一种编程范式或编程风格。它以类或对象做为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,做为代码设计和实现的基石 。
  • 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。

类比面向对象编程与面向对象编程语言的定义,对于面向过程编程和面向过程编程语言这两个概念,给出下面这样的定义。编程语言

  • 面向过程编程也是一种编程范式或编程风格。它以过程(能够为理解方法、函数、操做)做为组织代码的基本单元,以数据(能够理解为成员变量、属性)与方法相分离为最主要的特色。面向过程风格是一种流程化的编程风格,经过拼接一组顺序执行的方法来操做数据完成一项功能。
  • 面向过程编程语言首先是一种编程语言。它最大的特色是不支持类和对象两个语法概念,不支持丰富的面向对象编程特性(好比继承、多态、封装),仅支持面向过程编程。

不过,这里必须声明一下,就像咱们在以前讲到的,面向对象编程和面向对象编程语言并无官方的定义同样,这里我给出的面向过程编程和面向过程编程语言的定义,也并非严格的官方定义。之因此要给出这样的定义,只是为了跟面向对象编程及面向对象编程语言作个对比,以方便你理解它们的区别。模块化

定义不是很严格,也比较抽象,因此,我再用一个例子进一步解释一下。假设咱们有一个记录了用户信息的文本文件 users.txt,每行文本的格式是 name&age&gender(好比,小王 &28& 男)。咱们但愿写一个程序,从 users.txt 文件中逐行读取用户信息,而后格式化成 nametagetgender(其中,t 是分隔符)这种文本格式,而且按照 age 从小到达排序以后,从新写入到另外一个文本文件 formatted_users.txt 中。针对这样一个小程序的开发,咱们一块来看看,用面向过程和面向对象两种编程风格,编写出来的代码有什么不一样。函数式编程

首先,咱们先来看,用面向过程这种编程风格写出来的代码是什么样子的。注意,下面的代码是用 C 语言这种面向过程的编程语言来编写的。函数

struct User {
  char name[64];
  int age;
  char gender[16];
};

struct User parse_to_user(char* text) {
  // 将text(“小王&28&男”)解析成结构体struct User
}

char* format_to_text(struct User user) {
  // 将结构体struct User格式化成文本("小王\t28\t男")
}

void sort_users_by_age(struct User users[]) {
  // 按照年龄从小到大排序users
}

void format_user_file(char* origin_file_path, char* new_file_path) {
  // open files...
  struct User users[1024]; // 假设最大1024个用户
  int count = 0;
  while(1) { // read until the file is empty
    struct User user = parse_to_user(line);
    users[count++] = user;
  }
  
  sort_users_by_age(users);
  
  for (int i = 0; i < count; ++i) {
    char* formatted_user_text = format_to_text(users[i]);
    // write to new file...
  }
  // close files...
}

int main(char** args, int argv) {
  format_user_file("/home/zheng/user.txt", "/home/zheng/formatted_users.txt");
}复制代码

而后,咱们再来看,用面向对象这种编程风格写出来的代码是什么样子的。注意,下面的代码是用 Java 这种面向对象的编程语言来编写的。this

public class User {
  private String name;
  private int age;
  private String gender;
  
  public User(String name, int age, String gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
  
  public static User praseFrom(String userInfoText) {
    // 将text(“小王&28&男”)解析成结构体struct User
  }
  
  public String formatToText() {
    // 将结构体struct User格式化成文本("小王\t28\t男")
  }
}

public class UserFileFormatter {
  public void format(String userFile, String formattedUserFile) {
    // Open files...
    List users = new ArrayList<>();
    while (1) { // read until file is empty 
      // read from file into userText...
      User user = User.parseFrom(userText);
      users.add(user);
    }
    // sort users by age...
    for (int i = 0; i < users.size(); ++i) {
      String formattedUserText = user.formatToText();
      // write to new file...
    }
    // close files...
  }
}

public class MainApplication {
  public static void main(Sring[] args) {
    UserFileFormatter userFileFormatter = new UserFileFormatter();
    userFileFormatter.format("/home/zheng/users.txt", "/home/zheng/formatted_users.txt");
  }
}复制代码

从上面的代码中,咱们能够看出,面向过程和面向对象最基本的区别就是,代码的组织方式不一样。面向过程风格的代码被组织成了一组方法集合及其数据结构(struct User),方法和数据结构的定义是分开的。面向对象风格的代码被组织成一组类,方法和数据结构被绑定一块儿,定义在类中。spa

面向对象编程相比面向过程编程有哪些优点?

为何面向对象编程晚于面向过程编程出现,却能取而代之,成为如今主流的编程范式?面向对象编程跟面向过程编程比起来,到底有哪些优点?翻译

1.OOP 更加可以应对大规模复杂程序的开发

对于简单程序的开发来讲,不论是用面向过程编程风格,仍是用面向对象编程风格,差异确实不会很大,甚至有的时候,面向过程的编程风格反倒更有优点。由于需求足够简单,整个程序的处理流程只有一条主线,很容易被划分红顺序执行的几个步骤,而后逐句翻译成代码,这就很是适合采用面向过程这种面条式的编程风格来实现。

但对于大规模复杂程序的开发来讲,整个程序的处理流程错综复杂,并不是只有一条主线。若是把整个程序的处理流程画出来的话,会是一个网状结构。若是咱们再用面向过程编程这种流程化、线性的思惟方式,去翻译这个网状结构,去思考如何把程序拆解为一组顺序执行的方法,就会比较吃力。这个时候,面向对象的编程风格的优点就比较明显了。

面向对象编程是以类为思考对象。在进行面向对象编程的时候,咱们并非一上来就去思考,如何将复杂的流程拆解为一个一个方法,而是采用曲线救国的策略,先去思考如何给业务建模,如何将需求翻译为类,如何给类之间创建交互关系,而完成这些工做彻底不须要考虑错综复杂的处理流程。当咱们有了类的设计以后,而后再像搭积木同样,按照处理流程,将类组装起来造成整个程序。这种开发模式、思考问题的方式,能让咱们在应对复杂程序开发的时候,思路更加清晰。

除此以外,面向对象编程还提供了一种更加清晰的、更加模块化的代码组织方式。好比,咱们开发一个电商交易系统,业务逻辑复杂,代码量很大,可能要定义数百个函数、数百个数据结构,那如何分门别类地组织这些函数和数据结构,才能不至于看起来比较凌乱呢?类就是一种很是好的组织这些函数和数据结构的方式,是一种将代码模块化的有效手段。

实际上,利用面向过程的编程语言照样能够写出面向对象风格的代码,只不过可能会比用面向对象编程语言来写面向对象风格的代码,付出的代价要高一些。并且,面向过程编程和面向对象编程并不是彻底对立的。不少软件开发中,尽管利用的是面向过程的编程语言,也都有借鉴面向对象编程的一些优势。

2.OOP 风格的代码更易复用、易扩展、易维护

面向过程编程是一种很是简单的编程风格,并无像面向对象编程那样提供丰富的特性。而面向对象编程提供的封装、抽象、继承、多态这些特性,能极大地知足复杂的编程需求,能方便咱们写出更易复用、易扩展、易维护的代码。为何这么说呢?

首先,咱们先来看下封装特性。封装特性是面向对象编程相比于面向过程编程的一个最基本的区别,由于它基于的是面向对象编程中最基本的类的概念。面向对象编程经过类这种组织代码的方式,将数据和方法绑定在一块儿,经过访问权限控制,只容许外部调用者经过类暴露的有限方法访问数据,而不会像面向过程编程那样,数据能够被任意方法随意修改。所以,面向对象编程提供的封装特性更有利于提升代码的易维护性。

其次,咱们再来看下抽象特性。咱们知道,函数自己就是一种抽象,它隐藏了具体的实现。咱们在使用函数的时候,只须要了解函数具备什么功能,而不须要了解它是怎么实现的。从这一点上,无论面向过程编程仍是是面向对象编程,都支持抽象特性。不过,面向对象编程还提供了其余抽象特性的实现方式。这些实现方式是面向过程编程所不具有的,好比基于接口实现的抽象。基于接口的抽象,可让咱们在不改变原有实现的状况下,轻松替换新的实现逻辑,提升了代码的可扩展性。

再次,咱们来看下继承特性。继承特性是面向对象编程相比于面向过程编程所特有的两个特性之一(另外一个是多态)。若是两个类有一些相同的属性和方法,咱们就能够将这些相同的代码,抽取到父类中,让两个子类继承父类。这样两个子类也就能够重用父类中的代码,避免了代码重复写多遍,提升了代码的复用性。

最后,咱们来看下多态特性。基于这个特性,咱们在须要修改一个功能实现的时候,能够经过实现一个新的子类的方式,在子类中重写原来的功能逻辑,用子类替换父类。在实际的代码运行过程当中,调用子类新的功能逻辑,而不是在原有代码上作修改。这就听从了“对修改关闭、对扩展开放”的设计原则,提升代码的扩展性。除此以外,利用多态特性,不一样的类对象能够传递给相同的方法,执行不一样的代码逻辑,提升了代码的复用性。

因此说,基于这四大特性,利用面向对象编程,咱们能够更轻松地写出易复用、易扩展、易维护的代码。固然,咱们不能说,利用面向过程风格就不能够写出易复用、易扩展、易维护的代码,但没有四大特性的帮助,付出的代价可能就要高一些。

3.OOP 语言更加人性化、更加高级、更加智能

人类最开始跟机器打交道是经过 01 这样的二进制指令,而后是汇编语言,再以后才出现了高级编程语言。在高级编程语言中,面向过程编程语言又早于面向对象编程语言出现。之因此先出现面向过程编程语言,那是由于跟机器交互的方式,从二进制指令、汇编语言到面向过程编程语言,是一个很是天然的过渡,都是一种流程化的、面条式的编程风格,用一组指令顺序操做数据,来完成一项任务。

从指令到汇编再到面向过程编程语言,跟机器打交道的方式在不停地演进,从中咱们很容易发现这样一条规律,那就是编程语言愈来愈人性化,让人跟机器打交道愈来愈容易。笼统点讲,就是编程语言愈来愈高级。实际上,在面向过程编程语言以后,面向对象编程语言的出现,也顺应了这样的发展规律,也就是说,面向对象编程语言比面向过程编程语言更加高级!

跟二进制指令、汇编语言、面向过程编程语言相比,面向对象编程语言的编程套路、思考问题的方式,是彻底不同的。前三者是一种计算机思惟方式,而面向对象是一种人类的思惟方式。咱们在用前面三种语言编程的时候,咱们是在思考,如何设计一组指令,告诉机器去执行这组指令,操做某些数据,帮咱们完成某个任务。而在进行面向对象编程时候,咱们是在思考,如何给业务建模,如何将真实的世界映射为类或者对象,这让咱们更加能聚焦到业务自己,而不是思考如何跟机器打交道。能够这么说,越高级的编程语言离机器越“远”,离咱们人类越“近”,越“智能”。

顺着刚刚这个编程语言的发展规律来想,若是一种新的突破性的编程语言出现,那它确定是更加“智能”的。大胆想象一下,使用这种编程语言,咱们能够无需对计算机知识有任何了解,无需像如今这样一行一行地敲不少代码,只须要把需求文档写清楚,就能自动生成咱们想要的软件了。

重点回顾

1. 什么面向过程编程?什么面向过程编程语言?

实际上,面向过程编程和面向过程编程语言并无严格的官方定义。理解这两个概念最好的方式是跟面向对象编程和面向对象编程语言进行对比。相较于面向对象编程以类为组织代码的基本单元,面向过程编程则是以过程(或方法)做为组织代码的基本单元。它最主要的特色就是数据和方法相分离。相较于面向对象编程语言,面向过程编程语言最大的特色就是不支持丰富的面向对象编程特性,好比继承、多态、封装。

2. 面向对象编程相比面向过程编程有哪些优点?

  • 面向对象编程相比起面向过程编程的优点主要有三个。
    对于大规模复杂程序的开发,程序的处理流程并不是单一的一条主线,而是错综复杂的网状结构。面向对象编程比起面向过程编程,更能应对这种复杂类型的程序开发。
  • 面向对象编程相比面向过程编程,具备更加丰富的特性(封装、抽象、继承、多态)。利用这些特性编写出来的代码,更加易扩展、易复用、易维护。
  • 从编程语言跟机器打交道的方式的演进规律中,咱们能够总结出:面向对象编程语言比起面向过程编程语言,更加人性化、更加高级、更加智能。

思考

面向对象编程比面向过程编程,更加容易应对大规模复杂程序的开发。但像 UnixLinux 这些复杂的系统,也都是基于 C 语言这种面向过程的编程语言开发的,怎么看待这个现象?

参考:面向对象相比面向过程有哪些优点?面向过程真的过期了吗?

本文由博客一文多发平台 OpenWrite 发布!

更多内容请点击个人博客沐晨

相关文章
相关标签/搜索