Я пытаюсь получить голову вокруг AOP, и некоторый спокойный Код действительно помог бы.
Из Википедии вот некоторый пример кода (легок для 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 использует Компилятор Метаобъекта, и некоторая функциональность могла бы быть "введена" с динамическими методами.... просто сматывание в клубок слюны здесь ;)
Править: Дать лучший контекст: Я действительно люблю динамические аспекты (питание) спокойного метаобъекта с сигналами и слотами и хотел бы сохранить спокойное чувство к нему. Таким образом моя идея состоит в том, чтобы использовать слоты (или сигналы), когда точка сокращает. Например:
Если я определяю slot Bank::transfer(...)
и затем signal Bank::OnBeforeTranfer()
и signal Bank::OnAfterTransfer()
. Если я затем подключаю их к другим аспектам, говорят Security::transfer()
и Logger::transfer()
(весь QObjects) я могу заблокировать вызовы (как сбой OnBeforeTransfer).
Но, если бы мы затем берем его к следующей эволюции для получения меньше и более чистый код, я хотел бы избавиться от OnXXXX
сигналы и подключение Bank::transfer
слот к Security::transfer
слот и Logger::transfer
. Что-либо динамическое в QT?: Как порядок вызова слотов и и предотвращение следующего вызова в "цепочке слота"?
Этот целый контекст можно все еще считать правом AOP? Я пытаюсь придерживаться "сокращений точки уровня метода" или являюсь мной полностью не по существу здесь?