2010-07-28 89 views
13

我试图让我的脑袋围绕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的权利?我试图坚持“方法级别削减”或者我完全不在这里?

+0

基本概念很好。我只是想看看在Qt中如何做到这一点。特别是在“安全方面”(checkUserPermission)时应该“阻止”一次传输。如果我放置任何IF语句,那么我的代码不会被分解到特定的安全性方面...... – 2010-07-29 06:47:39

+0

另一个很好的例子http://stackoverflow.com/questions/242177/what-is-aspect-oriented-programming – 2011-03-13 13:32:18

+0

出于好奇,你成功了吗? – 2011-10-27 09:48:42

回答

1

您打算使用哪种语言的Qt?我最近不得不围绕一个python脚本在Qt中构建一个简单的GUI,并使用AOP python包Aspyct在东西前后做一些快速操作。 Qt是事件驱动的编程,我认为熟悉Qt基础知识,许多事情类似于AOP风格的操作,然后找到一些AOP库,用于你计划使用Qt的语言。

+0

嗯......我认为自己超越了Qt基础;)最后,对我而言,这种方法通过使用[CQRS](http://stackoverflow.com/questions/tagged/cqrs)进入“更高层次的抽象” 。从这个意义上说,我没有直接在方法层面上实现它,从而证实了“更高层次的关注”。我仍然想知道是否没有qt方式或Qt的精神。我会看看Aspyct是否符合我对AOP的先入之见。 – 2011-03-13 13:13:29

+0

对不起忘记了,我正在使用C++(gcc) – 2011-03-13 13:22:51

0

如果你想要要保持在Qt框架内,你可以看看the State Machine Framework。 (并摆脱例外:)

然后你可以连接记录器状态变化事件。

+0

有趣的方法。我已经使用了状态机,但主要是在“动态/不断变化的业务规则上下文”中,这是它的设计目的。使用自定义事件可能会有一个特定的感觉..但是我在动态方法之后或使用槽作为点削减(如果这是有道理的) – 2011-04-02 09:47:19

1

您可能会考虑使用的另一个AOP框架是AspectC++。我已经玩了一下,它似乎工作得很好。他们甚至在网站上有一篇白皮书,介绍AspectC++如何与Qt一起使用。