2008-11-28 80 views
43

任何人都可以發佈一個面向方面編程(AOP)的例子,即而不是日誌?面向方面的編程實例

我看了幾個資源,但所有的例子都是微不足道的日誌記錄。它對於什麼有用?

回答

33

一種產品,其貸款的例子直接從這個Aspect Oriented Programming: Radical Research in Modularity, Youtube video被畫到顯示器。在這個例子中,你有一個繪圖程序,它由點,形狀等組成,當這些對象發生變化時,你需要告訴顯示器自行更新。沒有在一個方面處理它,你最終會重複一下自己。

正如我所瞭解的那樣,AOP的創建是爲了不重複自己,因爲它可能與業務邏輯沒有任何關係。通過這些方面,您可以將這些擔憂模塊化。其中一個例子是日誌記錄,但有很多不同的事情可能最終會重複。它一直在發展,它不再是面向方面的編程,而是面向方面的建模。

約面向方面的編程

的更多信息可以從這些來源中找到:

3

安全性 - 在執行某些方法之前檢查用戶是否具有適當的權限。

2

公共不變量檢查。由於PostSharp 1.5將帶有方面繼承,即使通過接口,它也會帶來很多新的機會。

6

驗證的概述:

[NotNull] 
public string Property1 { get; set; } 

[Length(Min = 10, Max = 20)] 
public string Property2 { get; set; } 

[Regex(Expression = @"[abc]{2}")] 
public string Property3 { get; set; } 
+1

de方面在哪裏? 但是,您可以使用一些建議來閱讀來自點提供的連接點的此「註釋」,如: * * save(..) 因此,如果需要,您可以使用before建議進行驗證並繼續進行,或者拋出一些關於無效狀態的失敗條件。 – paulosuzart 2008-11-28 12:37:23

+0

這取決於驗證的使用位置以及使用的是哪種UI框架。我不會將這些方面用於需要驗證的實體,而更多用於「防禦性編碼」。我不使用存儲庫中保存方法的實體驗證,但是我在UI中的某處進行了驗證。 – Paco 2008-11-28 19:50:29

3

你不能在Java的多重繼承Java中的一個更好的辦法來實現。但是通過使用AOP,你可以「有限」多重繼承。 嘗試谷歌這看到一些例子。

我也同意Eyvid。 Hannemann和Kiczales的論文非常適合學習設計模式的基礎知識並獲得一些很好的AOP示例。

4

另一個經典的例子(如日誌記錄)是緩存。但其他例子更有趣。

6

撤消 - 我打電話給支持撤消操作的第三方程序集。它要求調用者創建一個撤消上下文,調用程序集中的一些方法,然後銷燬撤消上下文。上下文可以嵌套。此外,如果上下文已創建,但仍處於需要重新啓動應用程序的不受歡迎狀態。

通常使用撤消我會寫這樣的事情

void foo() 
    { 
     int id = lib.create_undo_context(); 
     try 
     { 
      lib.performsomeaction(); 
      lib.performsomeaction(); 
      lib.performsomeaction(); 

     } 
     finally 
     { 
      lib.destroy_undo_context(id); 
     } 
    } 

與PostSharp我定義一個名爲[撤消]屬性,創建方法開始時撤消背景和毀壞它,當方法退出(即使拋出一個異常) - 使代碼看起來像這樣

[Undo] 
    void foo() 
    { 
     lib.performsomeaction(); 
     lib.performsomeaction(); 
     lib.performsomeaction(); 
    } 

這是一個更復雜一點實現這個比我展示,因爲我已經確保所有撤消上下文,即使在有嵌套撤消的情況下被清理上下文 - 但你明白了。

1

交易管理。

在我看來,您不希望可能屬於交易一部分的對象知道它們處於交易中。使用AOP,您可以根據需要將對象組合到事務中,而無需事務中的對象知道事務處於事務中,甚至不需要知道事件是否存在於AOP框架中。

2

我已經使用了面向方面的編程來實現關鍵字搜索引擎。它更像是一個實驗,但它顯示了AOP如何用於記錄和跟蹤以外的目的。

基本上:
(i)所述發動機的用戶標記他/她的類作爲KeywordSearchable,
(ⅱ)發動機開始跟蹤創建&破壞這些KeywordSearchable實例,
(ⅲ)所述的發動機的萃取來自這些KeywordSearchable對象的關鍵字,
(iv)給定對象和關鍵字,算法負責搜索。

關於此的更多詳細信息可在http://montrealistic.blogspot.com/2011/08/aspect-oriented-implementation-of.html找到。

4

依賴注入

嚴格地說,依賴注入只不過是一個橫切關注點更多。很多依賴注入框架使用基於屬性的編程式是這樣的:

public class Car:IDisposable 
{ 
    [Inject] 
    public IGearBox Gearbox { get; set; } 
    ... 
} 

的〔進樣]屬性也可以設計成沒有任何依賴於外部框架的一個方面。 AOP的

2

實例:

  • 解析器和評估器用於算術表達式。這可以使用訪問者模式進行編程,但我相信這些方面是更好的選擇。
  • 一個簡單的文本編輯器,其中一些管理任務(例如,維護「文件已更改」標誌和窗口標題)被視爲單獨的方面。
  • 字符串的數據結構,其中字符串表示爲樹狀,以便可以在不進行復制的情況下實現拼接和子字符串選擇。爲了保持效率,樹木有時需要重新平衡;平衡代碼被視爲一個方面。

讓我們想象一下,你想記錄一個消息中域模型的方法:

示例:伐木無AOP:

namespace Examples\Forum\Domain\Model; 

class Forum { 

    /** 
    * @Flow\Inject 
    * @var \Examples\Forum\Logger\ApplicationLoggerInterface 
    */ 
    protected $applicationLogger; 

    /** 
    * Delete a forum post and log operation 
    * 
    * @param \Examples\Forum\Domain\Model\Post $post 
    * @return void 
    */ 
    public function deletePost(Post $post) { 
      $this->applicationLogger->log('Removing post ' . $post->getTitle(), LOG_INFO); 
      $this->posts->remove($post); 
    } 

} 

如果你必須這樣做在很多地方,日誌記錄將成爲你領域模型邏輯的一部分。你將不得不在你的模型中注入所有的日誌依賴。由於日誌記錄不是領域模型應該關心的內容,因此這是非功能性需求和所謂的交叉性關注的一個例子。

使用AOP時,模型中的代碼對於日誌記錄一無所知。它將專注於業務邏輯。