我正试图绕过AOP,一些Qt代码真的会有所帮助.
从维基百科这里有一些示例代码(很容易让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. :) ");
}
Run Code Online (Sandbox Code Playgroud)
然后"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...
}
Run Code Online (Sandbox Code Playgroud)
Qt有信号和插槽来解耦对象.但我仍然需要发出信号.
那么:这可以用Qt完成,还是需要维基百科文章中引用的一些特殊框架/预处理器?
我觉得必须有一些技巧,因为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对吗?我试图坚持"方法级别削减"或者我完全不在这里?
归档时间: |
|
查看次数: |
1645 次 |
最近记录: |