2012-12-12 14 views
4

我正在學習面向方面編程當我嘗試練習一點時,我意識到我在同一方面設計了不同的方法,並開始懷疑這是否是最好的方法,或者如果我應該爲不同的方法創建不同的方面。 我會盡力解釋更多我所做的: 我有2類:何時應該圍繞同一方面採取行動,何時應該創建不同方面?

  1. 計算器類有幾種方法,屁股加法,乘法,否定,復位等
  2. AOPmain類。

我創建另一個類(ReturnMessage類)是一個方面,在這種I類創建2種方法 - 你可以在下面的代碼看到)(一種是在的一半施加在計算器類中找到的方法,以及在同一類中的其他方法的第二種 - 計算器)。 我的問題是:在一個方面編寫幾個方法來與其他方法進行交互,是否是一個好的做法,或者爲它創建不同的方面會更好? 這裏是我的方面的代碼:

@Aspect 
public class ReturnMessage { 
    //the joinPoint is used to get the method names and args. 
    @Before("execution(public void *(double))") 
    public void returningMessage(JoinPoint jp) { 
     String method = jp.getSignature().getName(); 
     double value = (Double) jp.getArgs()[0]; 
     System.out.println("Going to "+method+" "+value); 
    } 
    @Before("@annotation(lala)") 
    public void returnMsg2(MyAnnotation lala) { //<-- should I create another aspect to put this method? 
     System.out.println(lala.msg()); 
    } 
} 

我相信這將是有趣的,不僅對我,但計算器的所有用戶誰也開始在AOP編程,所以我希望你們要pacient。

+1

我完全困惑哪些類正在被建議,哪些類是方面你所說的「在一個方面編寫幾個方法來與其他方法交互」中的「交互」。也許你可以用名字而不是說一個班級,其他班級,另一個班級等 –

+0

「這是一個很好的做法......」問題最常回答「有時」。如果你想要什麼時候做x而不是y,你應該問「我應該什麼時候做x而不是y?」會回答「什麼時候應該有一個團隊 - 行動到同一個方面,什麼時候應該創造不同的方面?」和你目前的問題一樣有用嗎? –

+0

是@MikeSamuel,我會以你的筆記爲例。對不起,我問我的方式,我同意你的看法。 SO的質量需要保持高水平,但你不同意人。 – periback2

回答

4

我會爲每一個我想跟蹤的橫切關注點創建一個方面。沒關係,在你的方面有多個切入點/方法。

你可以有負責記錄一個方面,一個用於度量等等

我發現這個鏈接非常有用,當我與AOP的工作來衡量PERF。的現有應用程序。

它討論了現有代碼庫的方面,但它可以應用於任何情況。

Applying AspectJ to an Existing Codebase

+0

感謝您的建議@ Cygnusx1! – periback2

+0

不用客氣 – Cygnusx1

1

即使它們不是傳統的目的,內容是軟件組件是應該尊重的良好的設計原則 - 包括high cohesion。我不是AspectJ專家,但我認爲在決定是否要在方面添加方法時,高內聚是最重要的一點。

面向方面的編程已經有可能使執行路徑變得更加模糊,所以我不認爲將每個方法分離到自己的方面將是一個好主意。這將導致許多「老兄在哪裏是我的代碼」遊戲,以供將來的開發人員在同一系統中工作。我認爲將方法組合在一個方面會是一個更好的主意,所以他們更容易找到。

1

aspect也是class和其他人已經回答它應該包含相關功能。爲了解釋Cygnusx1,你不希望單一方面有記錄和生成度量的建議。

可能需要根據其定位的切入點進一步組織。例如,考慮Logger方面生成多個不同的日誌,例如,簡潔而詳細。

在包com.company.project.logging中創建這個方面是有意義的。但是你是否希望它指代所有代碼中需要注意的地方?可能不會。

我會做的是創建一個抽象方面並擴展包含具體的建議和抽象的命名切點。然後,我會用各種包裝com.company.project.dataaccess,com.company.project.purchase等中的具體方面來擴展它,它們實現了這些抽象切入點。

因此,我所做的是暴露了一個方面,記錄並允許個別模塊所有者定義何時應該觸發這些方面。

相關問題