你知道什么是 AOP 吗()

前言 AOP 的全称为 Aspect Oriented Programming,意思是:面向切面编程。
为什么会有这篇文章?是因为看了 Laravel 中 Pipeline 的设计,发现 Pipeline 就是基于 AOP 思想的一种实现。
【你知道什么是 AOP 吗()】说起 AOP,就不得不说起 OOP,它们又是什么关系,有什么区别?
AOP 与 OOP 的区别 OOP 我们都知道,全程为 Object Oriented Programming ,意思是:面向对象编程。
首先我们要知道 AOPOOP 不是相互对立的关系,可以把 AOP 看作是弥补 OOP 的不足,以此之长、补彼之短,两者结合使用效果最佳。
OOP 是针对业务 实体 及其 属性 和 行为 进行 抽象封装 ,这个不难理解,例如:用户模块、订单模块 等。
AOP 是针对业务切面进行提取,它所面对的是处理过程中的某个 步骤 或 阶段 ,以达到逻辑处理过程中各部分之间低耦合性的 隔离效果 ,例如:日志记录、权限验证 等。
举个例子就容易理解了,如果单纯使用 OOP ,需要在日志模块、订单模块中进行权限验证、日志记录怎么办?难道要在每个方法前都加入权限验证、日志记录的代码吗?那么如果需要在每个方法前和方法后都记录日志怎么办?
这时如果使用 AOP,就可以借助代理完成这些重复的操作,就可以不在每个方法前加入权限验证、日志记录的代码,降低各部分之间的耦合。
AOP 能做什么 除了上面说的 权限验证、日志记录,AOP 还可以做 数据加解密、请求响应数据规范 ...
只要是和具体的业务无关的,同时又是业务都在关注的,那么都可以通过 AOP 去抽离这些关注点并将其统一维护,提高代码的复用性。
上面的业务关注点是不是有点似曾相识... 其实我们常用的 路由中间件 就是基于 AOP 思想的一种实现。
AOP 的一种实现 举例:Laravel 中的 路由中间件

/** * Send the given request through the middleware / router. * * @param\Illuminate\Http\Request$request * @return \Illuminate\Http\Response */ protected function sendRequestThroughRouter($request) { $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware) ->then($this->dispatchToRouter()); }

通过上述代码,可以发现需要执行的中间件配置在 through() 方法中,执行后再执行 then 方法。
上述代码用在了 路由中间件 中,当然也可以用在其他地方,比如用到 controller 中,就可以这样写:
// 示例代码$pipes = [ LoggingPipeline::class,// 日志记录 PermitPipeline::class,// 权限验证 ]; return app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return $content; });

上面只是在 Laravel 中的一种实现,当然在 PHP 的其他框架中也有类似的实现,例如:YiiThinkPHP 等。
AOP 只是个思想,当然也有其他语言实现,例如:GolangJava等。
推荐阅读
  • 编程是一种思想,而不是敲代码
  • 做业务系统研发如何做到认真负责?

    推荐阅读