我試圖讓我的腦袋圍繞AOP和一些Qt代碼真的有幫助。Qt中的面向方面的編程
從wikipedia這裏是一些示例代碼(方便一個Qt/C++程序員閱讀):
void transfer(Account fromAcc, Account toAcc, int amount, User user, Logger logger)
throws Exception {
logger.info("transferring money...");
if (! checkUserPermission(user)){
logger.info("User has no permission.");
throw new UnauthorizedUserException();
}
if (fromAcc.getBalance() < amount) {
logger.info("Insufficient Funds, sorry :(");
throw new InsufficientFundsException();
}
fromAcc.withdraw(amount);
toAcc.deposit(amount);
//get database connection
//save transactions
logger.info("Successful transaction. :) ");
}
然後 「aspectized」:
void transfer(Account fromAcc, Account toAcc, int amount) throws Exception {
if (fromAcc.getBalance() < amount) {
throw new InsufficientFundsException();
}
fromAcc.withdraw(amount);
toAcc.deposit(amount);
}
aspect Logger
{
void Bank.transfer(Account fromAcc, Account toAcc, int amount, User user, Logger logger)
{
logger.info("transferring money...");
}
void Bank.getMoneyBack(User user, int transactionId, Logger logger)
{
logger.info("User requested money back");
}
// other crosscutting code...
}
Qt的已經信號和槽去耦對象。但我仍然需要發出信號。
所以:這可以用Qt來完成,還是需要一些特殊的框架/預處理器,如維基百科文章中所引用的?
我有一種感覺,必須有一些技巧,因爲Qt使用元對象編譯器和一些功能可能會被「注入」的動態方法....只是在這裏吐泥包;)
編輯 :爲了給出更好的上下文:我非常喜歡帶有信號和插槽的Qt元對象的動態方面(力量),並且希望保持Qt的感覺。因此,我的想法是利用插槽(或信號)作爲點削減。例如:
如果我定義了slot Bank::transfer(...)
,然後signal Bank::OnBeforeTranfer()
和signal Bank::OnAfterTransfer()
。如果我然後將它們連接到其他方面,例如Security::transfer()
和Logger::transfer()
(所有QObject),我可以阻止呼叫(如失敗OnBeforeTransfer)。
但是,如果我們再帶它去下一個演進獲得更少和更清潔的代碼,我想擺脫OnXXXX
信號和Bank::transfer
插槽連接到Security::transfer
插槽和Logger::transfer
。 Qt中有什麼動態的東西? :如同呼叫時隙的順序,並阻止「時隙鏈」中的下一個呼叫?
這整個上下文仍然可以被認爲是AOP的權利?我試圖堅持「方法級別削減」或者我完全不在這裏?
基本概念很好。我只是想看看在Qt中如何做到這一點。特別是在「安全方面」(checkUserPermission)時應該「阻止」一次傳輸。如果我放置任何IF語句,那麼我的代碼不會被分解到特定的安全性方面...... – 2010-07-29 06:47:39
另一個很好的例子http://stackoverflow.com/questions/242177/what-is-aspect-oriented-programming – 2011-03-13 13:32:18
出於好奇,你成功了嗎? – 2011-10-27 09:48:42