2008-08-21 32 views
36

AOP在我看來是一個有趣的編程範例。然而,還沒有關於它的討論,但在這裏stackoverflow(至少我找不到它們)。你對此總體看法如何?你在項目中使用AOP嗎?或者你認爲這是一種相當有利的技術,它不會長期存在或不會成爲主流(至少在理論上,就像OOP一樣))?你是否在生產軟件中使用AOP(Aspect Oriented Programming)?

如果您確實使用AOP,請告訴我們您使用的工具。謝謝!

回答

12

是的。與安全性一樣,正交問題最好使用AOP風格的截取來完成。無論是自動完成(通過依賴注入容器等)還是手動完成對最終目標都不重要。

舉一個例子:xUnit.net(我運行的一個開源項目)中的「before/after」屬性是AOP風格的方法攔截的一種形式。你用這些屬性修飾你的測試方法,在測試方法運行之前和之後,你的代碼被調用。它可用於設置數據庫和回滾結果,更改測試運行的安全上下文等。

另一個示例:ASP.NET MVC中的過濾器屬性也可以像專門的AOP樣式的方法攔截器。例如,其中一個允許您說出如何處理未處理的錯誤,如果它們發生在您的操作方法中。

許多依賴注入容器,包括Castle Windsor和Unity,都支持「在框中」或通過擴展的使用。

+1

要求什麼是最好的時要小心。許多專家認爲能力模型是實現安全性的最佳方式,而AOP是一件可怕的事情。 – 2011-10-15 15:41:21

+0

@Brad,你說有些事情最好用AOP完成。你能解釋一下,AOP方式與傳統方式相比,究竟是什麼優勢? – Pacerier 2014-06-13 22:44:40

3

在我的一個大項目中,我們使用了aspectJ很長一段時間。該項目由多個Web服務組成,每個服務都有幾個功能,這是複雜文檔處理/查詢系統的前端。大約75k行代碼。我們使用了兩個相對較小的功能。

首先是追蹤應用程序流程。我們創建了一個在每個函數調用之前和之後運行的方面,以打印出「進入」函數「」和「退出」函數「」。使用函數選擇器的東西(切入點可能?我不記得正確的名稱),我們可以使用它作爲調試工具,只選擇我們想要在給定時間追蹤的函數。這對我們項目中的方面來說非常好用。

我們做的第二件事是應用程序特定指標。我們將方面放在我們的Web服務方法的周圍,以捕獲時間,對象信息等,並將結果轉儲到數據庫中。這很好,因爲我們可以捕獲這些信息,但仍然將所有捕獲的代碼與執行該工作的「真實」代碼分開。

我已閱讀了一些方面可以帶來的好方法,但我仍然不相信他們可以真正做到任何你無法做到的(或許更好)「正常」技術。例如,我想不出任何主要的特性或功能,我們的任何項目都需要,沒有方面就無法輕鬆完成 - 我發現在這些方面有用的是我剛纔提到的那些次要的東西。

15

Python支持AOP,讓您在運行時動態修改其類(在Python中通常稱爲monkeypatching而非AOP)。以下是我的一些AOP用例:

  1. 我有一個網站,其中每個頁面都是由Python函數生成的。我想參加一堂課並讓所有由該課程生成的網頁受密碼保護。 AOP來拯救;在每個函數被調用之前,我會進行適當的會話檢查並在必要時重定向。

  2. 我想在實際使用過程中對我的程序中的一些函數進行一些日誌記錄和分析。 AOP讓我可以計算時間和打印數據來記錄文件,而無需實際修改任何這些功能。

  3. 我有一個模塊或類充滿了非線程安全功能,我發現自己在一些多線程代碼中使用它。有些AOP增加了對這些函數調用的鎖定,而無需進入庫並進行任何更改。

這種東西不會經常出現,但每當它出現時,monkeypatching就非常有用。 Python也有裝飾器實現裝飾器設計模式(http://en.wikipedia.org/wiki/Decorator_pattern)來完成類似的事情。

請注意,動態修改類也可以讓您解決錯誤或向第三方庫添加功能,而無需實際修改該庫。我幾乎從不需要這樣做,但是它出現的次數非常有用。

1

我在我的C#應用​​程序中大量使用AOP。我不喜歡使用Attributes,所以我使用Castle DynamicProxy和Boo在運行時應用方面,而不會污染我的代碼

4

Terracotta我們使用AOP和字節碼工具來相當廣泛地集成和儀器第三方,第三方軟件。例如,我們的Spring intergration大部分通過使用aspectwerkz完成。簡而言之,我們需要攔截對Spring bean和bean工廠的調用,以便對它們進行聚類。

所以AOP可以與第三方的代碼,否則就無法修改整合有用。但是,我們發現存在一個巨大的陷阱 - 如果可能的話,只能在您的連接點中使用第三方公共API,否則您可能會冒險在下一個次要版本中通過對某些私有方法的更改而破壞代碼,維護噩夢。

4

AOP和交易分界是在天堂相匹配的。我們使用Spring AOP @Transaction註釋,它比我在其他地方見過的更容易和更直觀的TX劃分。

1

我們在會議外觀中使用AOP爲我們的客戶提供一致的框架來定製我們的應用程序。這使我們可以公開一個自定義點,而無需爲每種方法添加手動鉤子支持。

此外,AOP提供配置的額外交易建立和拆除,以及通常的記錄的東西的單個點。總而言之,比手工完成所有這些工作更可維護。

7

我不明白如何在不使用AOP的情況下以一種乾淨的方式處理日誌,安全,事務管理,異常處理等交叉問題。無論他們知道與否

任何使用Spring框架(Java企業開發人員大概是50%)是使用AOP。

1

我工作的主要應用程序包括一個腳本宿主。 AOP允許主機在決定是否將腳本加載到應用程序域之前檢查腳本的屬性。由於一些腳本非常麻煩,這使得在運行時加載速度更快。

我們還使用並計劃使用大量的屬性,如編譯器控制,流控制和in-IDE調試等,這些屬性不需要成爲最終分佈式應用程序的一部分。

1

我們使用PostSharp作爲我們的AOP解決方案。我們目前使用了緩存,錯誤處理和數據庫重試方面,並且正在將我們的安全檢查視爲一個方面。

適合我們。開發人員確實喜歡分離關注點。架構師確實喜歡將平臺級邏輯整合到一個位置。

PostSharp庫是一個後期編譯器,用於執行代碼的注入。它有一個預先定義的攔截庫,它們很容易實現。感覺像事件處理程序中的連線。

相關問題