前言
AOP
的全稱為 Aspect Oriented Programming,意思是:面向切面程式設計。
為什麼會有這篇文章?是因為看了 Laravel 中 Pipeline 的設計,發現 Pipeline
就是基於 AOP
思想的一種實現。
說起 AOP
,就不得不說起 OOP
,它們又是什麼關係,有什麼區別?
AOP 與 OOP 的區別
OOP
我們都知道,全程為 Object Oriented Programming ,意思是:物件導向程式設計。
首先我們要知道 AOP
與 OOP
不是相互對立的關係,可以把 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
的其他框架中也有類似的實現,例如:Yii
、ThinkPHP
等。
AOP
只是個思想,當然也有其他語言實現,例如:Golang
和 Java
等。