莆田网站建设维护,网站建设费的会计处理,张家港市网站制作,网站服务器建设教程视频简述
在过往的工作中#xff0c;我发现很多人搞不清面向对象和面向过程的区别#xff0c;总认为使用面向对象编程语言来开发#xff0c;就是在面向面向对象编程了。而实际上#xff0c;他们只是在用面向对象编程语言#xff0c;编写面向过程风格的代码而已#xff0c;并…简述
在过往的工作中我发现很多人搞不清面向对象和面向过程的区别总认为使用面向对象编程语言来开发就是在面向面向对象编程了。而实际上他们只是在用面向对象编程语言编写面向过程风格的代码而已并没有发挥面向对象编程的优势。这就相当于手握一把屠龙刀却只把它当做一把普通的到来使用。 1.什么是面向过程编程与面向过程编程语言
如果你是一名比较资深的程序员最开始学习编程的时候接触的是 Basic、C等面向过程的编程语言那么你对这两个概念肯定不陌生。但是如果你是新生代的程序员一开始学习编程的时候接触的就是面向对象编程语言那你对这两个概念可能不熟悉。所以在对比面向对象与面向过程优劣之前我们先把面向过程编程和面向过程编程语言这两个概念搞清楚。
我们可以比对这面向对象编程和面向对象编程语言这两个概念来理解面向过程编程和面向过程编程语言。我们来回顾下面向对象编程和面向对象编程语言
面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元并将封装、抽象、继承、多态这四个特性作为代码设计和实现的基石。面向对象编程语言支持类或对象的语法机制能方便地实现面向对象编程四大特性的编程语言。
类比面向对象编程和面向对象编程语言的定义对于面向过程编程和面向过程编程语言这个两个概念我给出下面这样的定义。
面向过程编程也是一种编程范式或编程风格。它以过程可理解为方法、函数、操作作为组织代码的基本单元以数据可理解为变量与方法相分离为主要的特点。面向过程风格是一种流程化的编程风格通过拼接一组顺序执行的方法来操作数据完成一项功能。面向过程编程语言首先是一种编程语言。它最大的特点是不支持类和对象这两个语法概念不支持风格的面向对象编程特性仅支持面向过程编程。
用一个例子来解释下。假设有一个记录了用户信息的文件 users.txt每行文本的格式是 nameagegender如小王28男。编写一个程序来逐行读取用户信息然后格式化成 name,age,gender 这种格式并且按照 age 从小达到排序后重新写入另一个文件 formatted_user.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) {// 将结构体User格式化成文本 “小王,28,男”
}void sort_users_by_age(struct User users[]) {// 按照年龄从小到大排序users
}void format_user_file(char* file_path, char* new_file_path) {// 打开文件...struct User users[1024]; // 假设最大1024个用户int count 0;while(1) {// 读取文件直到读取结束// 从文件内读取一行内容...struct User user parse_to_user(line);users[count] user;}sort_users_by_age(users);int i;for(i 0; i count; i) {char* formatted_to_text format_to_text(users[i]);// 写入formatted_to_text到文件...}// 关闭文件...
}int main(char ** args, int argv) {format_user_file(/file/user.txt, /file/formatted_user.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 parseFrom(String userInfoText) {// 将 “小王28男” 解析成类User}public String formatToText() {// 将类User转化成文本 “小王,28,男”}
}public class UserFileFormatter {public void format(String userFile, String formattedUserFile) {// 打开文件...ListUser users new ArrayList();while (true) { // 读取文件直到读取结束// 从文件内读取一行数据...User user User.parseFrom(userInfoText);users.add(user);}// 按照年龄排序...for (int i 0; i users.size(); i) {String formattedUserText users.get(i).formatToText();// 写入到新文件...}// 关闭文件...}
}public class MainApplication {public static void main(String[] args) {UserFileFormatter userFileFormatter new UserFileFormatter();userFileFormatter.format(/file/user.txt, /file/formatted_user.txt);}
}从上面代码可以看出面向过程和面向对象最近的区别是代码的组织方式不同。面向过程风格的代码组织成立一组方法集合及其数据结构struct User方法和数据定义是分开的。而面向对象风格的代码被组织成一组类方法和数据结构被绑定一起定义在类中。
可能有人会觉得上面这两个例子的面向对象编程和面向过程编程这两个风格的区别貌似不是很大呀。
2.面向对象编程比面向过程编程有哪些优势
为什么面向对象编程晚于面向过程编程出现却能取而代之称为主流的编程范式面向对象编程和面向过程编程比起来到底有哪些优势
2.1 OOP 更加能够应对大规模复杂程序的开发
刚刚的例子你可能感觉两种风格的代码貌似差不多顶多就是代码组织方式有点区别没有感觉到面向对象编程有什么优势。其实主要原因就是因为这个例子比较简单、不够复杂。
对于简单的开发来说不管是用面向过程编程风格还是面向对象编程风格差别确实不会很大甚至有时候面向过程的编程风格反而更有优势。因为整个程序的处理流程只有一条主线很容易被划分成顺序执行的几个步骤然后逐句翻译成代码这就非常适合采用面向过程这种面条式的编程风格来实现。
但是对于大模型复杂程序的开发来说整个程序的处理流程错综复杂并非只有一条主线。如果把整个程序的处理流程画出来的话会是一个网状结构。如果再用面向过程编程来实现就会比较吃力了。这个时候面向对象的编程风格的优势就比较明显了。
面向对象编程是以类为思考对象。在进行面向对象编程的时候并不是一上来就去思考将流程拆为一个个方法而是先去思考如何给业务建模将需求翻译为类如何给类之间建立交互关系而完成这些工作完全不需要考虑错综复杂的处理流程。当有了类的设计之后再像搭积木一样按照处理流程将类组装起来形成整个程序。这种开发模式、思考问题的方式能让我们在应对复杂程序开发的时候思路更加清晰。
此外面向对象编程还提供了一种更加清晰的、更加模块化的代码组织方式。比如我们开发一个电商系统业务逻辑发咋、代码量很大可能要定义数百个函数、数百个数据结构如何分门别类地组织这些函数和数据结构才能看起来不至于凌乱呢类就是一种非常好的组织这些函数和数据结构的方式是一种将代码模块化的有效手段。
有人可能互说像 C 语言这种面向过程的编程语言也可以按照功能的不同把函数和数据结构放到不同的文件里以达到给函数和数据结构分类的目的。不过面向对象编程本身提供了类的概念强制你做这件事情而面向过程编程并不强求。这也算是面向对象编程语言的一个小小的创新吧。
实际上利用面向过程的编程语言照样可以写出面向对象风格的代码只不过可能会比使用面向对象编程语言来说付出的代码要高一些。而且面向过程编程和面向对象编程并非完全对立。
2.2 OOP 风格的代码更易复用、易扩展、易维护
刚刚的例子比较简单只用到了类、对象这两个基本的概念并没有用到更加高级的四大特性。因此面向对象编程的优势其实并没有发挥出来。
面向对象编程提供的封装、抽象、继承、多态这些特性能极大地满足复杂的编程需求能方便我们写出更易复用、易扩展、易维护的代码。
首先封装特性将数据和方法绑定在一起通过访问权限控制只允许外部调用者通过类暴露的有限方法访问数据而不会像面向过程那样数据可以被任意访问和修改。因此面向对象编程提供的封装特性更有利于提高代码的易维护性。其次再看下抽象特性。我们知道函数本身就是一种抽象它隐藏了具体的实现。在使用函数的时候只需要了解函数具体有什么功能而不需要了解它是怎么实现的。从这一点上不管面向对象编程还是面向过程编程都支持抽象特性。不管面对对象编程还提供了其他抽象特性的实现方式这些实现方式是面向过程所不具备的比如基于接口实现的抽象。基于接口的抽象可以让我们在不改变原有实现的情况下轻松替换新的实现逻辑提高带代码的可扩展性。接着继承特性是面向对象编程相比于面向过程编程所特有的两个特性之一另一个是多态。如果两个类有一些相同的属性和方法我们就可以将这些相同的代码抽取到父类中让两个子类继承父类。这样两个子类也可以重用父类中的代码避免了代付重复多谢提高了代码的复用性。最后在看下多态这个特性。基于这个特性我们在需要修改一个功能实现的时候可以通过实现一个新的子类的方式在子类中重写原来的功能逻辑用子类代替父类。在实际的代码运行过程中调用子类新的功能逻辑而不是在原有代码上做修改。这就遵从了“对修改关闭、对扩展开放”的设计原则提高了代码的可扩展性。除此之外利用多态特性不同的类对象可以传递相同的方法执行不提供的代码逻辑提高了代码的复用性。
所以所基于四大特性利用面向对象编程我们可以更轻松地写出易复用、易扩展、易维护的代码。
2.3 OOP 语言更加人性化、更加高级、更加智能
人类最早和计算机打交道是通过 0、1 这样的二进制指令然后是汇编语言再之后才出现了高级编程语言。在高级编程语言中面向过程编程语言又早于面向对象编程语言出现。之所以先出现面向过程编程语言那是因为和及其的交互方式从二进制指令、汇编语言到面向过程编程语言是一个非常自然的过渡是一种流程化的、面条式的编程风格用一组指令顺序操作数据来完成一项任务。
从指令到汇编再到面向过程编程语言跟机器打交道的方式在不停地进化让人和机器打交道越来越容易。面向对象编程语言的出现也顺应了这样的发展规律也就是说面向对象编程语言比面向过程编程语言更加高级。
面向对象编程语言是一种人类的思维方式在进行面向对象编程的时候我们在思考如何给业务建模如何将真实的世界映射为类或对象这让我们更加聚焦到业务本身而不是思考如何跟机器打交道。 越高级的编程语言离机器越远离人类越近也越智能。