我正试图绕过AOP,而一些Qt Code确实会有所帮助。
从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()
(所有QObjects),我可以阻止调用(如失败的OnBeforeTransfer)。
但是,如果我们将它带到 next evolution 以获得更少更清晰的代码,我想摆脱OnXXXX
信号并连接Bank::transfer
槽到Security::transfer
广告位和Logger::transfer
。 Qt有什么动态吗? :类似于调用插槽的顺序,并阻止“插槽链”中的下一个调用?
这整个背景仍然可以被视为AOP对吗?我正在努力坚持“方法级别的削减”,还是我完全不在这里?
答案 0 :(得分:1)
您打算用什么语言使用Qt?我最近不得不在Qt中围绕python脚本构建一个简单的GUI,并使用AOP python包Aspyct在前后快速做一些事情。 Qt是事件驱动的编程,我会说熟悉Qt基础知识,许多事情类似于AOP风格的操作,然后为你计划使用Qt的语言找到一些AOP库。
答案 1 :(得分:1)
您可以考虑使用的另一个AOP框架是AspectC++。我玩了一下它似乎工作得很好。他们甚至在网站上有一份白皮书,描述了AspectC ++如何与Qt一起使用。
答案 2 :(得分:0)
如果你想留在Qt框架内,你可以看一下the State Machine Framework。 (并摆脱例外情况:)。
然后您可以将Logger连接到状态更改事件。