Ориентированное на ориентацию программирование в Qt

Я пытаюсь поднять голову вокруг АОП, и некоторый код Qt действительно поможет.

Из wikipedia здесь приведен пример кода (просто для программиста Qt/С++):

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. :) ");
 }

И затем "аспект":

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 или мне нужны некоторые специальные рамки/препроцессоры, как указано в статье wikipedia?

У меня такое чувство, что должен быть какой-то трюк, так как Qt использует компилятор метаобъектов, а некоторые функции могут быть "введены" динамическими методами... просто spit-balling здесь;)

Изменить. Чтобы дать лучший контекст: мне очень нравятся динамические аспекты (мощность) мета-объекта 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 script и использовать пакет python AOP Aspyct, чтобы сделать что-то быстро и после материала. Qt - это управляемое событиями программирование, я бы сказал, знакомы с основами Qt, многие вещи похожи на операции AOP-типа, а затем находят некоторые библиотеки AOP для языка, на котором вы планируете использовать Qt.

Ответ 2

Другая структура AOP, которую вы можете использовать, - AspectС++. Я немного поиграл с ним, и, похоже, он работает неплохо. У них даже есть технический документ на сайте, который описывает, как AspectС++ можно использовать с Qt.

Ответ 3

Если вы хотите остаться в рамках Qt, вы можете взглянуть на State Machine Framework. (И избавиться от исключений:)

Затем вы можете просто подключить Logger к событиям изменения состояния.