2009-05-17 141 views

回答

6
  • 可憐的工具鏈支持 - 調試器,分析器等可能不知道的AOP,所以可能好像所有的方面也換成了在代碼工作程序代碼
  • 代碼膨脹 - 小源可能導致更大的目標代碼的代碼在整個代碼庫
2

我不會把它的關鍵缺點「編織」,但我見過的最大的問題是開發者經驗之一適應能力。並非所有開發人員都瞭解聲明式編程和命令式編程之間的區別。

我們充分利用EntLib 4.1中的policy injection application block以及用於DI的Unity,這對於某些人來說並不是什麼沉淪。我發現自己一遍又一遍地向同一個人解釋爲什麼應用程序沒有按照他們的期望行事。它通常從他們開始解釋某些事情,然後我說「看到這個聲明在方法之上」。 :)有些人立刻就明白了,喜歡它,並且變得極富生產力 - 其他人也在奮鬥。

學習曲線並不是AOP所特有的,但它似乎有一個更高的學習曲線,表明您的普通開發人員遇到的其他事情。

7

維護和調試。使用aop,你突然有了在給定點(方法入口,出口,等等)運行的代碼,但是在查看代碼時,你不知道它甚至被調用,特別是如果aop配置位於另一個文件中,就像xml配置一樣。如果建議引起一些變化,那麼在調試應用程序時,事情可能會看起來很奇怪,沒有任何解釋。這不會影響只有新手。

+1

http://stackoverflow.com/a/201084/13940 – 2011-12-22 18:00:57

8

我認爲最大的缺點就是很好地使用AOP。例如,人們在沒有意義的地方使用它,並且不會在任何地方使用它。

例如,工廠模式顯然是AOP可以做得更好的東西,因爲DI也可以做得更好,但使用AOP時觀察者模式更簡單,策略模式也更簡單。

單元測試會更困難,特別是如果您在運行時進行編織。

如果在運行時進行編織,那麼您也會受到性能影響。

當把AOP和類混合在一起時,有一個很好的方法來模擬發生什麼事情是一個問題,因爲UML我不認爲這是一個很好的模型。

除非您使用Eclipse,否則工具確實有問題,但使用Eclipse和AJDT AOP更容易。

我們仍然使用junit和nunit作爲例子,所以必須修改我們的代碼以允許單元測試在使用特權模式時運行,AOP可以通過測試私有方法來更好地進行單元測試,而且我們不必改變我們的程序只是爲了讓他們與單元測試一起工作。這是另一個並不真正理解AOP如何有所幫助的例子,我們仍然通過單元測試框架和當前設計模式實現在很多方面與過去相鏈接,並沒有看到AOP如何幫助我們做更好的編碼。

+0

單元測試真的很難嗎?單元測試不應該測試這些方面,現在又取決於它們是如何編織的? – Zombies 2011-10-28 14:18:53

+1

@ Zombies - 你如何測試自己的方面,因爲唯一的方法就是包含它們。如果您在運行時編織,那麼它必須設置爲在測試運行時進行編織。 – 2011-10-28 20:52:42

0

關於維護/調試的論點,面向方面的編程往往與敏捷軟件開發實踐的所有其他方面並行不悖。

這些做法傾向於從圖片中刪除調試,用單元測試和測試驅動開發替代它。另外,通過建議維護一個小的,明確的代碼足跡比沒有建議的大的,難以理解的代碼足跡要容易得多(建議是將大的,不可理解的代碼足跡轉換成小的,清晰的代碼足跡)。

0

因爲AOP的威力,如果你的橫切有bug,它可能會導致普遍的問題。另一方面,有人可能會改變程序中的連接點 - 例如,通過重命名或移動方法 - 以方面編寫者沒有預料到的方式,帶來意想不到的後果。模塊化橫切關注的一個優點是使一個程序員能夠輕鬆地影響整個系統。

8

我認爲最大的問題是,沒有人知道如何定義一個方面,或的語義如何聲明連接點的非程序化

如果您無法定義某個方面獨立於其將嵌入的上下文的獨立性,或者定義它所具有的效果,使其不會損害其嵌入的上下文,你(和工具)不能推斷它的可靠性。 (你會注意到方面最常見的例子是「日誌記錄」,它被定義爲「將一些東西寫入應用程序不知道的日誌流中」,因爲這非常安全)。這違反了David Parnas的關鍵概念information hiding。我看到的最糟糕的方面之一是將同步原語插入代碼;這影響了代碼可能具有的可能交互的序列。除非應用程序已經只有微不足道的事情,否則你怎麼可能知道這是安全的(不會死鎖?不會死鎖?不會失效保護?在面對同步合作伙伴拋出的異常時是可恢復的)。

現在通常通過提供某種標識符通配符來定義連接點(例如,「將此方面放入名爲」DataBaseAccess *「的任何方法中,爲此,編寫受影響方法的人員必須發出他們的代碼通過以有趣的方式命名代碼來實現;這很難模塊化,更糟的是,爲什麼某個方面的受害者甚至必須知道它的存在?並且考慮如果你簡單地重命名一些方法會發生什麼;方面是否定的需要更長的時間注入,並且你的應用程序中斷了,所需要的是連接點規範,它們是有意的;不知何故,該方面必須知道在每個使用點不需要程序員放置霓虹燈標誌的情況下需要的地方(AspectJ有一些控制流程相關的連接點,在這個章節中看起來好一點ARD)。

所以方面是一種有趣的想法,但我認爲他們在技術上不成熟。而這種不成熟使他們的使用變得脆弱。這就是問題所在。 (我是自動化軟件工程工具的大愛好者[看我的生物]就是不這樣)。