Ориентированное на ориентацию программирование в 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 к событиям изменения состояния.