Qt中面向方面编程

时间:2010-07-28 21:46:03

标签: c++ qt aop

我正试图绕过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对吗?我正在努力坚持“方法级别的削减”,还是我完全不在这里?

3 个答案:

答案 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连接到状态更改事件。