Qt中面向方面的编程

Der*_*bee 13 c++ aop qt

我正试图绕过AOP,一些Qt代码真的会有所帮助.

维基百科这里有一些示例代码(很容易让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. :) ");
 }
Run Code Online (Sandbox Code Playgroud)

然后"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...
}
Run Code Online (Sandbox Code Playgroud)

Qt有信号和插槽来解耦对象.但我仍然需要发出信号.

那么:这可以用Qt完成,还是需要维基百科文章中引用的一些特殊框架/预处理器?

我觉得必须有一些技巧,因为Qt使用元对象编译器,并且某些功能可能会被"注入"动态方法....只是在这里吐痰;)

编辑:为了给出更好的上下文:我非常喜欢带有信号和插槽的Qt元对象的动态方面(功率),并希望保持Qt感觉.因此,我的想法是利用插槽(或信号)作为切点.例如:

如果我定义slot Bank::transfer(...)然后signal Bank::OnBeforeTranfer()signal Bank::OnAfterTransfer().如果我然后将它们连接到其他方面说Security::transfer()Logger::transfer()(所有QObjects)我可以阻止调用(如失败OnBeforeTransfer).

但是,如果我们接着进行下一次演进以获得更少和更清晰的代码,我想摆脱OnXXXX信号并将Bank::transfer插槽连接到Security::transfer插槽和Logger::transfer.Qt有什么动态吗?:像调用插槽的顺序和阻止" 插槽链 " 中的下一个调用?

这整个背景仍然可以被视为AOP对吗?我试图坚持"方法级别削减"或者我完全不在这里?

小智 1

您打算使用什么语言的 Qt?我最近不得不在 Qt 中围绕 python 脚本构建一个简单的 GUI,并使用 AOP python 包Aspyct来快速完成一些前后工作。Qt是事件驱动编程,我会说熟悉Qt基础知识,很多东西类似于AOP风格的操作,然后找到一些适合你计划使用Qt的语言的AOP库。