设计模式、面向对象三:面向过程变成与面向对象编程的区别

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

相较于面向对象编程以类为组织代码的基本单元,面向过程编程则是过程(或方法)作为组织代码的基本单元。它最主要的特点就是数据和方法相而分离


比如下面的以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");
}

它的代码组织成了一组方法集合及其数据结构(struct User),方法和数据结构的定义是分开的。
而面向对象风格的代码则是组织成一个类,方法和数据结构是被绑定一起,定义在类中

相较于面向对象编程语言,面向过程编程语言最大的特点就是不支持丰富的面向对象编程特性,比如继承、多态、封装

面向对象编程比面向过程编程有哪些优势?
  • 对于大规模复杂程序的开发啊,程序的处理流程并非单一的一条主线,而是错综复杂的网状结构。面向对象编程比起面向过程编程,更能应对这种复杂类型的程序开发
  • 面向对象编程相比面向过程编程,具有更加丰富的特性(封装、抽象、继承、多态)。利用这些特性写出来的代码,更加易扩展、易复用、易维护
  • 面向对象编程语言比面向过程编程语言,更加人性化、更加高级、更加智能。因为面向对象编程是以计算机的思维方式,而面向对象是以人的思维方式
在面向对象风格的代码编程中,哪些是违法面向对象编程风格的典型代码设计
  • 滥用getter、setter方法
    解决在设计实现类的时候,除非真的需要,否则尽量不要给属性定义setter方法。除此之外,尽管getter方法相对于setter方法要安全些,但是如果返回的是集合容器,那也要防范集合内部数据被修改的风险。
  • 滥用全局变量,全局方法
    解决:Constants类、Utils类的设计,对于这两种类的设计,我们尽量能做到职责单一,定义一些细化的小类,比如RedisConstants、FileUtils,而不是定义一个大而全的Constants类、Utils类。除此之外,如果能将这些类中的属性和方法,划分归并到其他业务中,那是最好不过的了,能极大的提高类的内聚性和代码的可复用性
  • 定义数据和方法(逻辑)分离的类、基于贫血模型的开发模式
什么是贫血模型

贫血模型又称为失血模型,是指domain object 仅有属性的getter/setter方法的纯数据类,将所有类的行为放到service层。

我们平时开发用的MVC框架模式,使用了面向对象编程了吗

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

MVC框架模式与贫血模型,面向对象冲突吗

引用王争设计模式的 嘉一的见解

MVC这个框架模式本质上与面向对象并不冲突。与贫血模型没直接关系
当我们在讨论面向对象的时候,我们究竟应该怎么样去定义一个对象,究竟什么才能被我们看成对象,是不是只有像某种物体,比如说一只鸟或者一只狗我们才能去把他定义为对象?
我认为,MVC里面的三个部分Model、Controller、View都能把他们单独的看成一个对象,比如Model,本来它就是数据单元,但是我们如果把他看做一个对象的话,里面存储的数据不就是我们对象里面的属性么,而对于数据的二次加工处理等等操作不就是对象里面的方法吗? 同理,对于VIew而言,里面的小的view组件 或者其他的view不就是我们对象里面的属性,而对于不同的view组件或者其他view的组合或者其他的处理操作不就是对象里面的方法么?所以 不必死扣定义,数据就一定要和业务逻辑组成一个类云云。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值