我试图让我的脑袋围绕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