2010-07-28 111 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一起使用。