【编程思想】理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)
文章目录
- 概念
- 面向过程编程OPP
- 面向对象编程OOP
- 面向切面编程AOP
- OPP和OOP
- AOP和OOP
- (1)AOP与OOP的关系
- (2)AOP主要应用场景
- (3)主要目标
概念
面向过程编程OPP
OPP 即:Procedure Oriented Programming,是一种以事物为中心的编程思想。主要关注“怎么做”,即完成任务的具体细节。
面向对象编程OOP
OOP即:Object Oriented Programming,是一种以对象为基础的编程思想。主要关注“谁来做”,即完成任务的对象。
面向切面编程AOP
AOP即:Aspect Oriented Programming,基于OOP延伸出来的编程思想。主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
每种编程思想都有各自的优点,它们适用在不同的情况下:面向过程性能很高,面向对象比较易于管理和维护,面向切面使软件变得更灵活。
新的编程范式,并不一定完全各方面都优于旧的编程范式,它们只是在某一特定领域或特殊场景下有着独到的优势。
编程范式只有适合不适合项目特性,没有绝对的好坏。
OPP和OOP
面向过程是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。
面向对象是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。类和继承是是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和类的继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态联编和实体的多态性。
举个例子:
比如完成“吃饭”这个任务。
面向过程的写法,需要封装一个eat()函数:
如果是狗吃屎,则eat(狗,屎);
如果是人吃肉,则eat(人,肉);
eat是人和狗共用的吃饭本能。
那如果之后要处理猫吃鱼、鱼吃虾、奥特曼吃小怪兽呢?eat函数中就会存在大量的if…else的判断,这段代码,无疑是很恶心的。
如果是面向对象思想,如何来解决这个问题呢?
我们发现,狗、人、猫、鱼、奥特曼,都有一个“吃”的共性。我们抽象出每个受体的类,然后继承,这样都具有“吃”的方法。
当我们想要执行狗吃屎时,那就“狗->eat(屎)”,这样,我们从面向过程维护eat()的焦点,转移到了面向对象维护角色的焦点上来。我们只需要维护好不同的角色(类)就好了,并且狗的eat不会影响到猫的eat,猫的eat也不会影响到人的eat。
所以,oop思想非常贴近软件工程高内聚的思想:自己管好自己的东西,自己做好自己的事情。
大多数支持面向对象的语言,同时也支持面向过程,不论是JAVA、PHP,还是JS,它们都还无法完全面向对象,因为面向过程是必然的,面向过程代表着必要的程序流程,调动对象进行组合或对象内部能力的实现,都一定会存在“过程”,它最终还是需要通过拆分步骤来指导最具体的执行细节。
在此,我们也能得到一些感悟,许多事情并非完全非黑即白,非OOP就必然是OPP,特别是思想层面的东西,它们呈现出互相结合的形态,从OPP到OOP,这是一个思想进步的过程。
AOP和OOP
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中的一个热点,也是很多框架如 java中的Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP只是一种思想的统称,实现这种思想的方法有挺多。AOP通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,提高开发效率。
那么,AOP如何体现?
这里可以联想一下laravel的中间件、javaweb的拦截器、vue的Decorator…java中的spring框架它们都是AOP思想的实践。装饰器模式、代理模式,它们也是基于AOP思想的设计模式。
AOP思想,指导我们通过找到平整切面的形式,插入新的代码,使新插入的代码对切面上下原有流程的伤害降到最低。
(1)AOP与OOP的关系
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。但是也有它的缺点,最明显的就是关注点聚焦时,面向对象无法简单的解决这个问题,一个关注点是面向所有而不是单一的类,不受类的边界的约束,因此OOP无法将关注点聚焦来解决,只能分散到各个类中。AOP(面向切面编程)则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。AOP并不是与OOP对立的,而是为了弥补OOP的不足。OOP解决了竖向的问题,AOP则解决横向的问题。因为有了AOP我们的调试和监控就变得简单清晰。
简单的来讲,AOP是一种:可以在不改变原来代码的基础上,通过“动态注入”代码,来改变原来执行结果的技术。
(2)AOP主要应用场景
日志记录,性能统计,安全控制,事务处理,异常处理等等。
(3)主要目标
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
【编程思想】理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)相关推荐
- java是面向对象还是面向过程_面向对象和面向过程最本质的区别是什么?
面向对象和面向过程最本质的区别在于考虑问题的出发点不同,面向过程是以事件流程为考虑问题的出发点,而面向对象则是以参与事件的角色(对象)为考虑问题的出发点,所以面向对象在处理问题时更加灵活.目前,面向过 ...
- php是面向对象还是过程,PHP面向过程和面向对象
php程序编写分为面向过程和面向对象.两者在功能实现上没有区别,但是在代码编写上区别很大,面向过程的代码很乱,不易管理,而面向对象把常用的功能封装为一个类,这样代码清楚多了. 下面举个小例子说明一下: ...
- 面向过程和面向对象的编程思想 复习原型 构造函数和实例对象和原型对象之间的关系
体会面向过程和面向对象的编程思想 <!DOCTYPE html> <html lang="en"> <head><meta charset ...
- 面向过程与面向对象——编程思想的演变
编程语言从无到有,据维基百科统计,至今为止有600多种.如此众多语言,需要逐个学习吗?实际上编程语言都是相通的,编程语言只需要精通一门即可,其他都能融会贯通.比如Java与C++就差不多,Java和C ...
- 从面向过程到面向对象编程的思想转变
项目的需求,要实现一个功能:更新表中若干行的部分列数据.Are you 明白大概要实现什么功能了吗? 嗯,我知道你明白了.那就接着往下看把. 遇到这样的问题,我相信很多人首先想到的方法是直接使用upd ...
- 面向过程与面向对象编程的区别和优缺点
■面向过程与面向对象编程的区别 转载至:https://www.cnblogs.com/strivers/p/6681876.html 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步 ...
- 面向过程和面向对象的设计思想、java类、Java类的定义、java对象、对象的创建和使用、类和对象、变量分类、方法分类、构造方法、方法的重载
1.面向过程和面向对象的设计思想 面向过程:procedure oriented programming 缩写 POP. 分析出解决问题所需要的步骤,然后把步骤一步一步实现. 面向过程直接关注流程. ...
- 如何理解面向过程和面向对象?
一句话理解面向对象 有人说:"如果上帝是程序员,他怎么创造世界上的所有动物.",理解这个问题就理解了面向对像. 面向过程和面向对象区别? 面向过程的思路:什么事都自己做:分析解决问 ...
- 面向过程和面向对象的本质理解
http://kiritor.blog.51cto.com/7400479/1226762/ 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象 ...
- Java面向对象(OOP)--面向过程 面向对象 OOP详解
1. 面向过程 & 面向对象 语言的进化发展跟生物的进化发展其实是一回事,都是"物以类聚".相近的感光细胞聚到一起变成了我们的眼睛,相近的嗅觉细胞聚到一起变成了我们的鼻子. ...
最新文章
- 电脑中的php怎么删除文件夹,php中删除文件夹以及文件夹中的文件的方法
- sql分区-纵向分表与横向分区表(转)
- Spring Security + Spring Session Redis——【SecurityContext】和【AuthenticationToken】JSON反序列化问题解决方案
- shell中的>/dev/null 2>1(转载)
- ASP.NET web.config中customErrors节点说明
- 转:Python中的文件和目录操作
- 如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式
- 如何在面试中介绍自己的项目经验?
- su root 后还是不能使用useradd ,useradd 等命令
- 图森未来C轮融资5500万美元,新浪继续跟投,无人卡车公开试乘
- java从控制台读取字符串_从控制台读取Java字符串
- (2) GoJS Node简介
- [SOA] Mule ESB 3.x 入门(二)—— 配置(spring, properties, log4j)
- 标准串口定义-9转25的串口线接法图
- Origin图例去除边框
- scratch少儿编程航天主题:模拟航天飞机飞行
- imac 蓝牙机械键盘_最好的蓝牙机械键盘
- APISpace 银行卡二要素API
- 四、文件管理(三)文件系统
- win7开启超级管理员账户(Administrator)
热门文章
- 深度学习进入太空,用于寻找月球登陆点
- 这样「撩」用户,产品增长得更快
- [时态]一、一般现在时态1 英文每造一句话都要考虑时态问题
- springboot项目启动异常汇总
- Android事件分发机制总结_若雪似风_新浪博客
- Android中常见的设计模式解析
- 7月3日云栖精选夜读丨数字化诗人:这可能是第一位用算法写诗的诺贝尔文学奖得主...
- 成为Android高手必须掌握的28大项内容和10个建议
- ATLAS——对抗性机器学习威胁矩阵<案例研究二>
- 计算机毕业设计ssm高考志愿填报指导系统3c3749(附源码)新手必备