编程范式:面向对象编程、面向过程编程和面向函数编程

古城微笑少年丶 2021-09-18 05:38 684阅读 0赞
  1. 什么是面向过程编程与面向过程编程语言?
  2. 面向对象编程相比面向过程编程有哪些优势?
  3. 为什么说面向对象编程语言比面向过程编程语言更高级?
  4. 有哪些看似是面向对象实际是面向过程风格的代码?
  5. 在面向对象编程中,为什么容易写出面向过程风格的代码?
  6. 面向过程编程和面向过程编程语言就真的无用武之地了吗?

概念

  • 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
  • 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。
  • 面向过程编程也是一种编程范式或编程风格。它以过程(可以理解为方法、函数、操作)作为组织代码的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点。面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
  • 面向过程编程语言首先是一种编程语言。它最大的特点是不支持类和对象两个语法概念,不支持丰富的面向对象编程特性(比如继承、多态、封装),仅支持面向过程编程。

面向过程:

  1. struct User {
  2. char name[64];
  3. int age;
  4. char gender[16];
  5. };
  6. struct User parse_to_user(char* text) {
  7. // 将text(“小王&28&男”)解析成结构体struct User
  8. }
  9. char* format_to_text(struct User user) {
  10. // 将结构体struct User格式化成文本("小王\t28\t男")
  11. }
  12. void sort_users_by_age(struct User users[]) {
  13. // 按照年龄从小到大排序users
  14. }
  15. void format_user_file(char* origin_file_path, char* new_file_path) {
  16. // open files...
  17. struct User users[1024]; // 假设最大1024个用户
  18. int count = 0;
  19. while(1) { // read until the file is empty
  20. struct User user = parse_to_user(line);
  21. users[count++] = user;
  22. }
  23. sort_users_by_age(users);
  24. for (int i = 0; i < count; ++i) {
  25. char* formatted_user_text = format_to_text(users[i]);
  26. // write to new file...
  27. }
  28. // close files...
  29. }
  30. int main(char** args, int argv) {
  31. format_user_file("/home/zheng/user.txt", "/home/zheng/formatted_users.txt");
  32. }

面向对象:

  1. public class User {
  2. private String name;
  3. private int age;
  4. private String gender;
  5. public User(String name, int age, String gender) {
  6. this.name = name;
  7. this.age = age;
  8. this.gender = gender;
  9. }
  10. public static User praseFrom(String userInfoText) {
  11. // 将text(“小王&28&男”)解析成类User
  12. }
  13. public String formatToText() {
  14. // 将类User格式化成文本("小王\t28\t男")
  15. }
  16. }
  17. public class UserFileFormatter {
  18. public void format(String userFile, String formattedUserFile) {
  19. // Open files...
  20. List users = new ArrayList<>();
  21. while (1) { // read until file is empty
  22. // read from file into userText...
  23. User user = User.parseFrom(userText);
  24. users.add(user);
  25. }
  26. // sort users by age...
  27. for (int i = 0; i < users.size(); ++i) {
  28. String formattedUserText = user.formatToText();
  29. // write to new file...
  30. }
  31. // close files...
  32. }
  33. }
  34. public class MainApplication {
  35. public static void main(String[] args) {
  36. UserFileFormatter userFileFormatter = new UserFileFormatter();
  37. userFileFormatter.format("/home/zheng/users.txt", "/home/zheng/formatted_users.txt");
  38. }
  39. }

面向过程和面向对象最基本的区别就是,代码的组织方式不同。面向过程风格的代码被组织成了一组方法集合及其数据结构(struct User),方法和数据结构的定义是分开的。面向对象风格的代码被组织成一组类,方法和数据结构被绑定一起,定义在类中。

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

1.OOP 更加能够应对大规模复杂程序的开发
2.OOP 风格的代码更易复用、易扩展、易维护
3.OOP 语言更加人性化、更加高级、更加智能

哪些代码设计看似是面向对象,实际是面向过程的?

  1. 滥用 getter、setter 方法

    Collections.unmodifiableList() 方法
    返回一个不可被修改的 UnmodifiableList 集合容器,而这个容器类重写了 List 容器中跟修改数据相关的方法,比如 add()、clear() 等方法。一旦我们调用这些修改数据的方法,代码就会抛出 UnsupportedOperationException 异常,这样就避免了容器中的数据被修改。

  2. 滥用全局变量和全局方法

    常见的全局变量有单例类对象、静态成员变量、常量等,常见的全局方法有静态方法。单例类对象在全局代码中只有一份,所以,它相当于一个全局变量。静态成员变量归属于类上的数据,被所有的实例化对象所共享,也相当于一定程度上的全局变量。而常量是一种非常常见的全局变量,比如一些代码中的配置参数,一般都设置为常量,放到一个 Constants 类中。静态方法一般用来操作静态变量或者外部数据。你可以联想一下我们常用的各种 Utils 类,里面的方法一般都会定义成静态方法,可以在不用创建对象的情况下,直接拿来使用。静态方法将方法与数据分离,破坏了封装特性,是典型的面向过程风格。

  3. 定义数据和方法分离的类

    传统的 MVC 结构分为 Model 层、Controller 层、View 层这三层。不过,在做前后端分离之后,三层结构在后端开发中,会稍微有些调整,被分为 Controller 层、Service 层、Repository 层。Controller 层负责暴露接口给前端调用,Service 层负责核心业务逻辑,Repository 层负责数据读写。而在每一层中,我们又会定义相应的 VO(View Object)、BO(Business Object)、Entity。一般情况下,VO、BO、Entity 中只会定义数据,不会定义方法,所有操作这些数据的业务逻辑都定义在对应的 Controller 类、Service 类、Repository 类中。这就是典型的面向过程的编程风格。

实际上,这种开发模式叫作基于贫血模型的开发模式,也是我们现在非常常用的一种 Web 项目的开发模式。

发表评论

表情:
评论列表 (有 0 条评论,684人围观)

还没有评论,来说两句吧...

相关阅读

    相关 面向对象编程

    面向对象编程 > 一切皆对象,面向对象编程特点封装、继承、多态 javascript的面向对象编程与其他的OOP语言不同,因为JS里没有类(class)的概念,什么是类,可

    相关 面向对象编程

    面向对象编程 概述: 面向对象本身就是一种方法;一种对现实世界理解和抽象的方法。也是一种更加符合人类的思想习惯的思想,将复杂问题简单化,将我们从执行者变成了指

    相关 面向对象编程

    面向对象编程 面向过程编程:核心是过程,过程是一步一步的。先干啥,后干啥。 对扩展性要求较低的程序例如:系统内核,git,计算器,等等。 优点:逻辑清晰,复杂问