2016-05-31 89 views
1

我想了解AOP中使用的問題的分離。因此,如果有人能夠解釋我使用一些基本的HelloWorld示例代碼散佈和代碼在AOP中纏繞是什麼,我將不勝感激。事後我會怎麼知道一個給定的問題不是系統核心問題,而是一個方面?非常感謝。什麼是aop中的散射和纏結

回答

4

恐怕我會用日誌記錄作爲例子,這是我們經常使用的一個例子,但我希望它能夠讓我們很容易理解。考慮這個helloworld程序日誌記錄:

public class HelloWorld { 

    private static Logger logger = Logger.getLogger(HelloWorld.class); 

    public static void main(String []argv) { 
    logger.entering("HelloWorld","main"); 
    System.out.println("Hello World"); 
    logger.exiting("HelloWorld","main"); 
    } 
} 

我班只有8行(忽略空格) - 其中3記錄,幾乎一半!日誌記錄與打印Hello World這個班級的主要目標無關。記錄是糾結與本課程的主要目標。如果我們可以移除它並以另一種方式表達,那麼我們將擁有一半的代碼,而班級主要嘗試實現的內容將更加清晰。此外,糾結可能會損害像重用這樣的功能 - 如果沒有它執行某些日誌記錄並需要某種日誌記錄基礎結構,則無法使用此代碼打印helloworld。

現在考慮一個真正的系統,其中有多個類,他們都在做日誌記錄。現在假設我決定改變我正在使用的日誌記錄方法之一 - 我希望我所有撥打entering的電話都改爲info幷包含一些額外的信息。惡夢!我的日誌記錄是分散在我的代碼庫中的。沒有一個地方可以做出這種改變,可能會有成千上萬。

如果我在一個方面捕捉到分散的橫切關注點,那麼只會有一個地方進行更改。

確定什麼可能是一個方面:

  • 考慮你的類的主要功能 - 什麼是他們從根本上正在修建的。是否有其他代碼並不嚴格與此相關,但您發現您需要這樣做(例如開始並提交事務,使用某個安全服務進行身份驗證)。
  • 你是否發現自己做了一遍又一遍的非常類似的事情 - 無論是跨多個班級,還是僅僅在一個班級中的多個方法。

散射可能是一個小規模的問題。也許每個類中的每個方法都重複某種模式,但沒有其他類正在使用它。在爲這個課程創建一個小方面,而不是僅僅解決這些方法中的散佈問題上沒有什麼壞處