设计模式学习笔记(3)-面向对象与面向过程

编程范式

  • 面向对象
  • 面向过程
  • 函数式编程

面向过程和面向对象

eg. 从users.txt 中读取用户信息,格式化成name\tage\tgender,并且按照age大小排序后写入另外一个文件

  • 面向过程

    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");
    }
  • 面向对象

     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&男”)解析成类User
      }
    
      public String formatToText() {
        // 将类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");
      }
    }

面向过程和面向对象的区别

  1. 代码组织方式不同,面向过程风格的代码被组织成一组方法集合和数据结构,数据和方法的定义是分开的,面向对象风格的代码则是将数据和操作数据的方式共同定义在了类里
  2. 上诉例子因为需求简单,面向对象的优势不怎么明显,反而面向过程更有优势,这是因为整个程序的处理流程只有简单的一条主线,很容易被划分为几个步骤,逐句翻译成代码,这非常适用面向过程编程风格来实现。但是当开发大规模复杂程序时候,整个程序的处理流程错综复杂,分支多的时候面向对象就更适用了,即我们思考的方式并不是如何用代码将这个流程表示出来,而是对整个业务建模,将整个程序抽象成不同的模块,然后对各个模块进行适配完成最终的业务。这种思考问题的方式可以让我们在开发的时候思路更清晰,不至于着迷与某个细节
  3. 面向对象基于四大特性,可以更轻松的写出易复用,易扩展,易维护的代码
  4. 面向对象更接近于我们人类的思维,更容易被人接受,这也是机器语言到汇编语言再到高级语言的一个发展过程

三种违反面向对象编程风格的代码设计

面向对象和面向过程不是非黑即白的关系,目的是为了写出更高质量的代码(忠臣、奸臣皆有所用,利益最大化)

  1. 滥用 getter,setter 方法,在设计实现类的时候除非真的需要,否则尽量不要给属性定义setter方法,如果返回的是集合容器,也要防范集合内部数据被修改的风险
  2. Constants类 、Utils类的设计问题。这两种类尽量做到职责单一,定义一些细化的类比如,MySQLConstants、FileUtils类,如果能把这些类的属性和方法划分到其他业务类中是最好不过的
  3. 基于贫血模型的开发模式,传统的MVC 结构在做前后端分离时会被分为Controller层、service层、repository层,controller层负责暴露接口给前端调用,service 层负责业务处理,repository层负责数据读写,在每一层中又会定义VO、BO、Entity,一般情况下VO、BO、Entity中只定义数据,而方法是定义在对应的Controller类,service类,repository 类中,这是典型的面向过程编程风格

附上大牛课程,需要可以直接去学习

http://gk.link/a/10fWa

猜你喜欢

转载自www.cnblogs.com/roadzhao/p/12295289.html
今日推荐