什么是面向过程编程?什么是面向过程编程语言
相较于面向对象编程以类为组织代码的基本单元,面向过程编程则是过程(或方法)作为组织代码的基本单元。它最主要的特点就是数据和方法相而分离。
比如下面的以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的组合或者其他的处理操作不就是对象里面的方法么?所以 不必死扣定义,数据就一定要和业务逻辑组成一个类云云。。。