精华内容
下载资源
问答
  • OOP AOP

    千次阅读 2017-10-10 00:08:48
    这篇文章是为了弄清楚 面向对象(OOP)、面向过程(OPP)、面向切面(AOP) 这三者的概念 , 以及在 Android中 AOP 的应用

    这篇文章是为了弄清楚 面向对象(OOP)、面向过程(OPP)、面向切面(AOP) 这三者的概念。


    OOP

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。

    面向对象是由面向过程演化而来,典型的面向过程语言就是 C,而 Java、C++、Python 等都是面向对象的编程语言。


    面向过程与面向对象

    面向过程是指考虑整个过程的步骤。

    比如,就拿吃饭这个问题来说,如果是面向过程,那么就会有以下的算法步骤:

    1. 买菜
    2. 洗菜
    3. 炒菜
    4. 吃饭

    可以看到,面向过程就是注重整个过程,你必须要考虑到所有步骤,而且一步也不能出错。

    面向对象就是把一类事物抽象出来,变成一个整体对象来考虑。

    如果是面向对象,那吃饭这个问题就这么考虑:

    1. 去餐馆点菜
    2. 吃饭

    这里的餐馆就是一个对象,这个对象具有买菜、洗菜、炒菜的功能,而我们就只用关心这个对象,它能解决吃饭的问题,完全不用关心炒菜等问题。

    面向对象符合人的思考习惯,更便于理解事物。

    现在总结出面向对象的三个特征是:封装、继承、多态。

    弊端

    即便是如此,面向对象也不是万能的。面向对象也有局限性,就拿 Bean 对象来说,因为面向对象的编程思想就必须尽量满足封装的特性,封装之后,外部访问 Bean 就必须通过 get()、 set() 方法,而这种方式,就会导致程序性能的下降。

    面向对象的出现是为了简化问题的复杂度,但在某些场景下也会增加复杂度。

    详细情况可了解 面向对象编程的弊端是什么?



    AOP

    AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过 预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。


    在 OOP 的思想下,我们会将系统在横向上拆分成多个模块,每个模块都相对独立,都有各自的职责划分。OOP 的精髓是把功能或问题模块化,每个模块处理自己的家务事。但在现实世界中,并不是所有问题都能完美得划分到模块中。

    举个最简单而又常见的例子:现在想为每个模块加上日志功能,要求模块运行时候能输出日志。

    按照 OOP 的思想来说,肯定是添加一个 日志模块,然后定义好对外提供的方法,然后让每个使用此功能的模块都来依赖日志模块,并自行使用日志输出功能。

    但这样划分模块真的完美吗?

    从OOP角度看,除了日志模块本身,其他模块的家务事绝大部分情况下应该都不会包含日志输出功能,但众多模块确实又需要打印日志。这个日志输出功能,从整体来看,都是一个上的。而这个面的范围,就不局限在单个模块里了,而是横跨多个模块。


    AOP 就是为了解决这种面的问题。

    • 第一,我们要认识到OOP世界中,有些功能是横跨并嵌入众多模块里的,比如打印日志,比如统计某个模块中某些函数的执行时间等。这些功能在各个模块里分散得很厉害,可能到处都能见到。
    • 第二,AOP的目标是把这些功能集中起来,放到一个统一的地方来控制和管理。如果说,OOP如果是把问题划分到单个模块的话,那么AOP就是把涉及到众多模块的某一类问题进行统一管理。

    AOP 的做法就是: 在预编译或者运行时,动态地将统一的代码切入到类的指定方法、指定位置上。

    一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。

    所有说,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。

    在 Spring 框架中,就可以看到大量的使用了 AOP 的相关技术。
    在Android端,近年来也有许多应用。



    Android 中的 AOP

    应用场景

    AOP 在 Android 中的主要应用场景如下:

    • 权限检查
    • 日志记录
    • 性能监控
    • 埋点操作

    这些都是最常见的,当然,你还可以发掘出更多的应用场景。


    应用工具

    AOP 也就是一种编程思想,如果要落实到具体的编码上,在Android 中则常常借助于 APT、AspectJ、Javassist 这三个工具。

    在源码的各个时期,它们的作用如下图:

    APT,AspectJ,Javassist对应的编译时期


    APT

    APT(Annotation Processing Tool),注解处理器。

    定义源码期的注解,然后继承 Proccesor 并通过查找特点注解,实现代码生成逻辑,利用 Java 编译器实现了编译期生成 .java 文件。

    在Android中,APT 应用的代表框架有:DataBinding,Dagger2, ButterKnife, EventBus3 、DBFlow、AndroidAnnotation。


    AspectJ

    AspectJ 支持将 .java 文件编译为 .class 文件时的编译期注入代码。

    AspectJ 语法比较多,但是掌握几个简单常用的,就能实现绝大多数切片,完全兼容 Java。

    AspectJ 除了 hook 之外,AspectJ 还可以为目标类添加变量,接口。另外,AspectJ也有抽象,继承等各种更高级的玩法。

    AspectJ 最具代表性的应用就是 Jake Wharton 的 Hugo


    Javassist

    Javassist 是对已经编译好的class文件进行操作。

    它需要结合 AS 的 gradle plugin 来使用,主要用于各大热修复框架 HotFix、




    参考



    展开全文
  • OOP与AOP

    2015-03-24 20:45:36
    面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。 OOP的思想:将数据及对数据的操作...

    面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。

    OOP的思想:将数据及对数据的操作行为放在一起,作为一个相互依存、不可分割的整体——对象。对与相同类型的对象进行分类、抽象后,得出共同的特征而形成了类,面向对象编程就是定义这些类。类似描述相同类型的对象集合。类定义好之后将作为数据类型用于创建类的对象。程序的执行表现为一组对象之间的交互通信。

    AOP的思想:一个应用,每个业务都是纵向的,很多业务就有很多的纵向的操作,这些业务都有一些共同的服务功能,为减小耦合度,进行横向的切割,将服务性功能与核心功能分离。


    OOP与AOP的区别:

    OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;而 AOP则是针对业务处理过程中的切面进行提取,例如,企业开发中经常会面临的种种非功能性需求(操作日志、权限控制、性能监测等等),用面向对象的思路,将业务操作对象的核心功能和对它的其他服务性功能代码分离,即某一个操作在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。 

     AOP则将这些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用 AOP将贯穿于各个模块间的横切关注点自动耦合进来。 AOP所面对的是处理过程中的某个步骤或阶段,对不同的阶段领域加以隔离,已获得逻辑过程中各部分之间低耦合性的隔离效果,其与面向方面编程在目标上有着本质的差异。 AOP的核心思想就是将应用程序中的业务逻辑处理部分同对其提供支持的通用服务,即所谓的“横切关注点”进行分离,这些“横切关注点”贯穿了程序中的多个纵向模块的需求。


    展开全文
  • OOP与AOP—浅谈

    2019-12-05 17:24:12
    今天小编来总结一下对OOP与AOP的认识。 主题: 1.OOP是什么? 2.AOP是什么? 【内容】 1.OOP,面向对象编程(Object Oriented Programming),是什么? 是一种利用对象进行编程的思想。 面向对象三大特征...

    【前言】

    今天小编来总结一下对OOP与AOP的认识。

    主题:

    1.OOP是什么?

    2.AOP是什么?

    【内容】

    1.OOP,面向对象编程(Object Oriented Programming),是什么?

    是一种利用对象进行编程的思想

    面向对象三大特征:

    封装继承多态

    那什么是封装、继承、多态?

    封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
    继承:继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

    什么时候用封装继承多态呢?

    根据实际情况进行选择,可能有时候不需要用,但是你用了,可能会很麻烦。但在需要的时候你用上了,那么难的问题就会变得简单起来。

    面向对象达到了软件工程的三个主要目标:

    重用性、灵活性和扩展性。

    2.AOP,面向切面编程(Aspect Oriented Program)

    同样也是一种思想

    官方解释:

    通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

    经过昨晚上和师父们一起讨论的结果,通过例子来理解:

    1.点线面问题(刁琳童师父)
    我们在一条线上针对一个点操作,所有的线都是针对这个点来操作的,把这些点合并起来,我们就形成了切面。

     2.数据库例子(刁琳童师父)
    我们现在的重构,写查询语句的时候,是每条语句查一个数据库的表(比较简单),但是当业务复杂的时候,可能需要查几个数据库中的某一个表,这时候我们就会有一个切面,可以先查1数据库,再查2数据库,3数据库,也可以先查2数据库,再查1数据库,3数据库。

    3.吃面条的例子(孙绍聪师父)

    当你吃面条的时候,咬断一口,这个时候可以做一个切面,你要吃一个枣,这个时候就是一个切面,接下来你可以选择先吃一个枣,再吃一口面条,你也可以先吃一口面条,再吃一个枣,但是形成了之后,这个规则不可变。

    个人理解:

    AOP,面向切面编程,就拿学生上机功能来说,在点击上机按钮上机的时候,你要判断一下此卡号是否正在上机,余额是否充足等这些问题,你是先判断卡号是否正在上机,还是余额是否充足,还是先判断余额是否充足,再判断卡号是否正在上机,这个时候就形成一个切面。

    3.OOP与AOP的区别与联系

    OOP面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。OOP与AOP可以并存。
    【感悟】

    感觉这两个东西比较抽象,范围很大,在学习项目编写代码的时候可能用到过这些思想,但自己可能不知道自己用了。只有看的多了,用的多了,才能更明白这两个概念,实践很重要。

    大家有什么见解,欢迎评论!!!

    展开全文
  • OOP与AOP关系

    2014-06-26 11:08:23
    OOP与AOP 的小总结  AOP(Aspect Oriented Programing )——面向切面编程OOP(ObjectOriented Programing )——面向对象编程AOPOOP的有益补充,它为程序提供了一个崭新的编程思考角度,可以重复性的横切逻辑抽取到...

                

                  AOP(Aspect Oriented Programing )——面向切面编程OOP(ObjectOriented Programing )——面向对象编程AOP 是OOP的有益补充,它为程序提供了一个崭新的编程思考角度,可以重复性的横切逻辑抽取到一个统一的模块中,只要通过纵向抽象和AOP 的横向抽取,程序员才可以真正解决重复性代码问题,提高代码的重用性与复用性。


           Spring 采用JDK的动态代理和CGLib动态代理的技术在运行期植入增强,所以用户不需要装备特殊的编译器或类装载器就可以使用AOP的功能,要使用JDK动态代理,目标类必须实现接口,而CGLib 不对目标类做任何的限制,它通过了动态生成目标类子类的方式提供代理。JDK在创建代理对象时的性能高于CGLib ,而生成代理对象运行性能却比CGLib 的低,如果生产singleton的代理,推荐使用CGLib动态代理。


           Spring 在方法级别上织入增强,Spring提供了四种类型方法增强,分别是的前置增强(Before) 后置增强(AfterReturning) 环绕增强(Around)和异常抛出增强(After-throwing),此外有一种特殊的引入增强,引入增强是类级别的,从广义上说,增强其实就是一种最简单的切面,它既包括横切代码也包括了切点信息,只不过切点的简单方法相对位置的信息,所以增强一般需要和切点联合才可以表示一个更加具体的实用切面。


           切面是切点和增强的联合体,用户可以方便的通过Spring 提供的ProxyBeanFactory 将切面织入不同的目标类中,当然,当每一个目标手工配置一个切面是比较麻烦和繁琐的,Spring利用了BeanPostProcessor 可干涉Bean生命周期的机制,提供了一些可以自动创建代理,织入切面的自动代理创建器,其中DefaultAdrisorAutoProxyCreater是功能强大的自动代理创建器,它可以将创建的所有的Adrisor自动织入目标Bean中。

    展开全文
  • OOP与AOP的区别和联系

    千次阅读 2019-05-06 20:54:50
    OOP与AOP的区别和联系 OOP:面向对象编程 核心思想:将客观存在的不同事物抽象成相互独立的类,然后把事物相关的属性和行为封装到类里,并通过继承多态来定义类彼此之间的关系,通过操作类的实例,来完成业务...
  • OOP与AOP的区别联系

    2019-05-07 16:14:03
    OOP是面向对象编程,核心思想是将客观存在的不同事物抽象成相互独立的类,然后把事物相关的属性和行为封装到类里,并通过继承和多态来定义类彼此间的关系,最后通过操作类的实例来完成实际业务逻辑的功能需求。...
  • 首先我们需要知道的是AOP是一种思想,而不是那种语句特有的,它可以克服那些只有单继承特性语言的缺点(比如Java,后面会有实例进行讲解) 区别: OOP(Object Oriented Programming) 面向对象编程是针对业务处理...
  • OOP与AOP的理解

    2018-11-26 09:31:36
    OOP是面向对象编程,核心思想是将客观存在的不同事物抽象成相互独立的类,然后把事物相关的属性和行为封装到类里,并通过继承和多态来定义类彼此间的关系,最后通过操作类的实例来完成实际业务逻辑的功能求。...
  • 浅谈OOP与AOP关系

    千次阅读 2016-07-23 17:10:19
    AOP(Aspect Oriented Programing )——面向切面编程OOP(ObjectOriented Programing )——面向对象编程AOPOOP的有益补充,它为程序提供了一个崭新的编程思考角度,可以重复性的横切逻辑抽取到一个统一的模块中,...
  • OOPAOP 的区别

    2018-02-09 08:52:32
    OOP是面向对象编程,核心思想是将客观存在的不同事物抽象成相互独立的类,然后把事物相关的属性和行为封装到类里,并通过继承和多态来定义类彼此间的关系,最后通过操作类的实例来...OOP与AOP的区别: 1、面向...
  • POP,OOP,AOP关系POP,OOP,AOPPOP面向过程编程(Process-oriented programming )OOP面向对象编程(Object Oriented Programming)AOP面向方面(切面)编程(Aspect Oriented Programming)POP,OOP,AOP关系 POP,OOP,AOP POP...
  • 一张图理解OOPAOP

    2019-07-02 16:23:29
    一张图理解OOPAOP 话不多说,直接上图~ 还没有讲清楚?别急,还有: AOP传送门: 一起来看AOP; Spring AOP 概述及其实现机制; Spring AOP 概念实现; Spring AOP 织入实现; Spring AOP AspectJ支持 OOP传送门...
  • 如何理解POP,OOPAOP之间的关系?POP、OOPAOP的简介POP、OOPAOP的之间的关系 POP、OOPAOP的简介 POP:面向过程编程 OOP:面向对象编程 AOP:面向切面编程 POP、OOPAOP的之间的关系 ...
  • OPP、OOP以及AOP的理解

    2019-08-02 13:49:28
    OPP(面向过程编程) OOP(面向对象编程) opp顾名思义,面向过程编程,主要是针对过程的,按照每个过程的实际执行顺序进行处理。而oop是针对对象的,通过抽象出一个共有的bean,然后各个对象还有各自的方法。到了...
  • 如何理解POP,OOPAOP之间的关系1.POP2.OOP3.AOP 1.POP pop即Process-oriented programming ,是一种面向过程编程。 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一...
  • OOPAOP区别

    2015-04-27 17:18:59
    AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。  举个简单的例子,对于“雇员”...
  • OOPAOP的区别联系

    2020-07-29 14:11:36
    OOP是面向对象编程,是将客观存在的不同事物抽象成相互独立的类,然后把事物相关的属性和行为封装到类里,并通过继承和多态来定义类彼此间的关系,最后通过操作类的实例来完成实际业务逻辑的功能需求。 AOP为...
  • POP、OOPAOP之间的关系POP(面向过程编程)新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居...
  • 如何理解POP,OOPAOP之间的关系POP—面向过程编程(Process Oriented Programming)OOP—面向对象编程(Object Oriented Programming)AOP—面向方面编程(Aspect Oriented Programming) POP—面向过程编程(Process ...
  • 对POP,OOP,AOP之间关系的理解 POP(面向过程编程Process Oriented Programming): 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用。 OOP(面向对象编程Object Oriented ...
  • 显然,结合OOPAOP 这两种技术实现的产品线系统将 具有更高的可复用性、灵活性和可配置性。本文在相关问题分析的基础上对基于OOPAOP 的产品线实现技术进行了研究,并通 过一个酬金发放系统产品线的实例分析对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,797
精华内容 9,518
关键字:

oop与aop