面向对象VS面向过程
1
前言
向伟人致敬
其实这个问题真的是被问烂了,特别是刚入门的同行,我感觉这个问题应该是大家都听说过了,但是有多少人真的是理解这两个区别呢,这两种方式并不是简简单单的两种编程语言的区分,可能会有人说,面向对象就是万物皆对象,说的没错,我也相信你是一个爱学习的好宝宝,这句话如果我没记错的话应该是出自《java编程思想》,这本神书,带领太多的IT小白走进了java世界,在此应该向大佬致敬。话不多说,回归正题,今天我们就来解释一下这两种编程方式的优劣。
首先我们先根据一个简单的小栗子,来体会一下,这两种编程方式的不同之处。
2
问题
面向过程VS面向对象
提一个问题
假如说两种鸟,一种是百灵鸟,一种是喜鹊,他们都会叫,但是声音不同,在面向对象的世界里我们应该怎么区分呢,或者说,怎么去表达这两种不同的鸟类呢。
3
java
面向对象
思考一下吧
java的开发者可能一眼就能想到应该怎么做,java是一种面向对象的编程语言,利用面向对象的继承、封装、多态的特性,我们很容易解决这个问题,毕竟这是对于面向对象最基本的应用了。我们先创建一个鸟类对象,让百灵鸟跟喜鹊都继承鸟类,分别实现鸟类中的叫声。
来一段代码
公共鸟类接口
public interface Bird { //公共的叫声行为 public void say();}
百灵鸟类
public class Lark implements Bird { //百灵鸟的叫声行为 @Override public void say() { System.out.println("百灵鸟叫了一声!"); }}
喜鹊类
public class Magpie implements Bird { //喜鹊的叫声行为 @Override public void say() { System.out.println("喜鹊叫了一声!"); }}
Test类
public class Test { public static void main(String [] args){ //喜鹊叫 say(new Magpie()); //百灵鸟叫 say(new Lark()); } private static void say(Bird bird){ bird.say(); }}
面向对象小结
三段言简意赅的代码充分展示了面向对象的代码风格,目前我们实现了面向对象的代码,继续进行面向过程的代码,
4
C
面向过程
思考一下吧
C语言的开发者可能遇到这个问题(本人JAVA,如有不妥,欢迎来稿),第一眼就是先写几个数据结构,然后将操作写到行为函数中,喜鹊跟百灵鸟分别为写一个数据结构,如图。
来一段代码
喜鹊数据结构
//喜鹊public class MagpieOP { String name = "喜鹊";}
百灵鸟数据结构
//百灵鸟public class LarkOP { String name = "百灵鸟";}
C代码
//面向过程,虽然用java写的,但是并没有用到三大特性,所以这段代码属于面向过程public class ProcedureOriented { public void Bird(String name){ if(name.equals("喜鹊")){ System.out.println("喜鹊叫了一声!"); }else if (name.equals("百灵鸟")){ System.out.println("百灵鸟叫了一声!"); } }}
面向过程小结
这段虽然使用intellij的java编译器写的,但是语法上属于面向过程,所以大家有时候不要去纠结着个问题。
6
重点
文章最重要的地方
重点来了!!!思考一个问题
如果现在,我需要增加一个啄木鸟类,这两种编程方式需要如何修改。
1、先说面向对象,我们只需要写一个啄木鸟类,然后让他继承鸟类,实现鸟类的叫声即可,不需要改动bird类。
2、再说面向过程,我们需要增加一个啄木鸟的数据结构,并且修改bird函数,在判断name时需要将啄木鸟加进去。
由此可见,面向对象的特点是修改数据结构的同时,不影响方法,也就是说添加一个类,不会对原系统的方法有影响。而面向过程在添加一个类的同时,需要修改原系统方法,但这能说明面向对象要比面向过程高级吗?我们继续思考一个问题。
再来思考一个问题!
如果现在,所有的鸟类都要吃东西,这两种编程方式需要如何修改。
1、先说面向对象,我们需要在bird类中增加一个eat方法,所有继承该bird类的鸟类都需要实现这个eat。
2、再说面向过程,我们只需要增加一下bird中的eat行为即可,不需要修改数据结构。
由此可见,也就是说当需要添加函数的时候,数据结构不会受到影响。相比于面向对象,面向过程对于添加行为特征要方便的多。
应该说,没有一种特别完美的编程方式,也不存在非常完美的编程语言,每一种语言都有他自己的闪光点,但是也有他的瑕疵,作为一个开发者,我们需要做的就是根据业务需求,择优开发。
7
总结
面向对象:修改数据结构的同时,不影响方法。
面向过程:添加函数的时候,数据结构不会受到影响。
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- android上拉下拉加载更多数据
- 「微信小程序」剖析(二):框架原理 | 在桌面浏览器上运行的尝试
- Working with Windows Workflow Foundation in ASP.NET
- 微信小程序剖析【下】:运行机制
- android多屏幕分辨率适配
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
- 怎么解决web service circular reference 问题
- android使用LruCache对listview加载图片时候优化处理
- 如何创建一个兼容「微信小程序」的Web框架:WIN
- RePractise前端篇: 前端演进史
- Git远程库版本回滚
- android 之ndk开发
- 【持续集成】使用 Jenkinsfile 设计直观的 Pipeline
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 内存占用用手就能算出来
- 如何在 CentOS 下快速搭建 Nginx 服务器
- Servlet API 源码剖析
- Borg:Google集群管理大杀器
- 一文了解Zookeeper
- 【投稿】刀哥:Rust学习笔记 4
- Spring Boot 运行源码剖析
- Spring Boot 特性之 Lazy
- Spring Boot 特性之 Banner
- Spring Boot 特性之 Fluent Builder API
- 一文搞懂 Flink Timer
- DATE类型的“小陷阱”
- 简单聊下 Java Agent
- Byte Buddy 基础知识
- 两种在SAP Cloud Application Studio里通过编程对C4C UI字段赋值的方法