你知道什麼是 AOP 嗎?

新亮發表於2022-01-09

前言

AOP 的全稱為 Aspect Oriented Programming,意思是:面向切面程式設計。

為什麼會有這篇文章?是因為看了 Laravel 中 Pipeline 的設計,發現 Pipeline 就是基於 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等。

推薦閱讀

相關文章