回答
一種產品,其貸款的例子直接從這個Aspect Oriented Programming: Radical Research in Modularity, Youtube video被畫到顯示器。在這個例子中,你有一個繪圖程序,它由點,形狀等組成,當這些對象發生變化時,你需要告訴顯示器自行更新。沒有在一個方面處理它,你最終會重複一下自己。
正如我所瞭解的那樣,AOP的創建是爲了不重複自己,因爲它可能與業務邏輯沒有任何關係。通過這些方面,您可以將這些擔憂模塊化。其中一個例子是日誌記錄,但有很多不同的事情可能最終會重複。它一直在發展,它不再是面向方面的編程,而是面向方面的建模。
約面向方面的編程的更多信息可以從這些來源中找到:
- 改爲:
- 聽:
- 看:
安全性 - 在執行某些方法之前檢查用戶是否具有適當的權限。
公共不變量檢查。由於PostSharp 1.5將帶有方面繼承,即使通過接口,它也會帶來很多新的機會。
安全
-
,檢查權限和阻止訪問
更友好的錯誤封郵件的asp.net器WebControls
-
,捕捉異常和寫入堆棧跟蹤時
- 注入代碼錯誤編譯時的調試編譯或友好的消息(如這裏的東西:Transparent generic exception handling for asp.net/MOSS2007 (with code))
性能
- 注入代碼,設置PERF的計數器來獲取您的應用程序很慢
驗證的概述:
[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; }
用Java和AspectJ(和Hannemann的Kiczales)設計模式實現: http://www.cs.ubc.ca/labs/spl/papers/2002/oopsla02-patterns.pdf
本文介紹如何某些GoF的設計模式可以使用AspectJ
你不能在Java的多重繼承Java中的一個更好的辦法來實現。但是通過使用AOP,你可以「有限」多重繼承。 嘗試谷歌這看到一些例子。
我也同意Eyvid。 Hannemann和Kiczales的論文非常適合學習設計模式的基礎知識並獲得一些很好的AOP示例。
My photo album使用AspectJ的三兩件事:
- Implementing the observer "pattern" as a reusable piece of code.
- Destroying a session for a specific type of call.
- Setting dirty flags on DTOs when mutation occurs.
第一,特別是相當多直出google tech talk on AOP的。它的模塊化方式與大多數人所考慮的方式不同。絕對推薦觀看,如果你有興趣如何使用它的好。
另一個經典的例子(如日誌記錄)是緩存。但其他例子更有趣。
撤消 - 我打電話給支持撤消操作的第三方程序集。它要求調用者創建一個撤消上下文,調用程序集中的一些方法,然後銷燬撤消上下文。上下文可以嵌套。此外,如果上下文已創建,但仍處於需要重新啓動應用程序的不受歡迎狀態。
通常使用撤消我會寫這樣的事情
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();
}
這是一個更復雜一點實現這個比我展示,因爲我已經確保所有撤消上下文,即使在有嵌套撤消的情況下被清理上下文 - 但你明白了。
交易管理。
在我看來,您不希望可能屬於交易一部分的對象知道它們處於交易中。使用AOP,您可以根據需要將對象組合到事務中,而無需事務中的對象知道事務處於事務中,甚至不需要知道事件是否存在於AOP框架中。
我已經使用了面向方面的編程來實現關鍵字搜索引擎。它更像是一個實驗,但它顯示了AOP如何用於記錄和跟蹤以外的目的。
基本上:
(i)所述發動機的用戶標記他/她的類作爲KeywordSearchable,
(ⅱ)發動機開始跟蹤創建&破壞這些KeywordSearchable實例,
(ⅲ)所述的發動機的萃取來自這些KeywordSearchable對象的關鍵字,
(iv)給定對象和關鍵字,算法負責搜索。
關於此的更多詳細信息可在http://montrealistic.blogspot.com/2011/08/aspect-oriented-implementation-of.html找到。
依賴注入
嚴格地說,依賴注入只不過是一個橫切關注點更多。很多依賴注入框架使用基於屬性的編程式是這樣的:
public class Car:IDisposable
{
[Inject]
public IGearBox Gearbox { get; set; }
...
}
的〔進樣]屬性也可以設計成沒有任何依賴於外部框架的一個方面。 AOP的
實例:
- 解析器和評估器用於算術表達式。這可以使用訪問者模式進行編程,但我相信這些方面是更好的選擇。
- 一個簡單的文本編輯器,其中一些管理任務(例如,維護「文件已更改」標誌和窗口標題)被視爲單獨的方面。
- 字符串的數據結構,其中字符串表示爲樹狀,以便可以在不進行復制的情況下實現拼接和子字符串選擇。爲了保持效率,樹木有時需要重新平衡;平衡代碼被視爲一個方面。
讓我們想象一下,你想記錄一個消息中域模型的方法:
示例:伐木無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時,模型中的代碼對於日誌記錄一無所知。它將專注於業務邏輯。
- 1. 面向方面編程C#
- 2. 面向方面編程StructureMap.DynamicInterception
- 3. Qt中的面向方面的編程
- 4. 什麼是面向方面的編程?
- 5. Spring Roo和麪向方面的編程
- 6. 面向方面的編程:在C#慢#
- 7. 面向方面編程的未來
- 8. Java中面向方面的編程
- 9. CakePHP中面向方面的編程
- 10. 面向方面的編程框架
- 11. 面向功能,動態和麪向方面編程的模式
- 12. 春季面向方面編程
- 13. ActionScript 3面向方面編程
- 14. Android中面向方面編程
- 15. 面向方面編程Clojure中
- 16. 面向特徵的編程 - 示例
- 17. 面向協議編程與面向對象編程的區別與範例
- 18. 面向方面編程和麪向對象編程有何區別
- 19. PHP的面向對象編程父實例孩子
- 20. 面向方面的示例項目
- 21. 面向對象編程範例
- 22. 實例配置面向PHP
- 23. Java面向對象編程:未能更新實例變量
- 24. 在面向對象編程中實例化接口
- 25. 如何在AOP(面向方面的編程)中使用單例類?
- 26. 面向方面的谷歌應用程序引擎編程(Java)
- 27. 以編程方式實例化Sharepoint中的Web部件頁面
- 28. 面向方面編程在面向對象的世界突破規則?
- 29. 面向方面編程和/或企業庫5.0的日誌/異常實施?
- 30. r中的面向方面的編程:任何可用的庫?
de方面在哪裏? 但是,您可以使用一些建議來閱讀來自點提供的連接點的此「註釋」,如: * * save(..) 因此,如果需要,您可以使用before建議進行驗證並繼續進行,或者拋出一些關於無效狀態的失敗條件。 – paulosuzart 2008-11-28 12:37:23
這取決於驗證的使用位置以及使用的是哪種UI框架。我不會將這些方面用於需要驗證的實體,而更多用於「防禦性編碼」。我不使用存儲庫中保存方法的實體驗證,但是我在UI中的某處進行了驗證。 – Paco 2008-11-28 19:50:29