C++ 0x keynote(以下简称0x)中描述了这样一个看起来不错的东西:
1、本地调用代码:
// use local object:
X x;
A a;
std::string s("abc");
// …
x.f(a, s);
2、使用远程代理wrapper层:
// use remote object :
proxy<X> x;
x.connect("my_host");
A a;
std::string s("abc");
// …
x.f(a, s);
仅使用一个包装层就完成远程调用?从目前的C++来看基本上不可能。 今天突然想到可以使用aspect c++来生成代码,因为aspect c++在生成代码时,也生成了一些简单的元信息,可以在函数里面取得函数的原型、各参数的类型等。 根据0x的描述,我编写了简单的测试代码:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
class LoginService
{
public:
virtual bool login (const string& name, const string& password, string& session) = 0;
virtual void logout (const string& session) = 0;
};
class RemoteCall
{
public:
bool connect (const char* host, unsigned short port)
{
cout << "connect success" << endl;
return true;
}
bool send (const char* p, size_t len)
{
cout << "send: " << endl;
cout << string(p, len) << endl;
return true;
}
bool recv(char* p, size_t len)
{
return true;
}
};
class RemoteLoginService : public LoginService, public RemoteCall
{
public:
virtual bool login (const string& name, const string& password, string& session)
{
return false;
}
virtual void logout (const string& session)
{
}
};
int main(int argc, char *argv[])
{
RemoteLoginService rls;
rls.connect("localhost", 3957);
string session;
rls.login("lijie", "lijie", session);
rls.logout(session);
return 0;
}
现在的目标是加入一个方面,让RemoteLoginService具有远程调用功能。当然由于此处RemoteCall并未实现,所以只要能够把这个调用正确序列化就算完成目标。 这个方面完成后如下:
aspect Remote
{
pointcut remote_class() = "RemoteCall";
pointcut remote_call() = derived(remote_class()) && !remote_class();
pointcut virtual_methods() = "% ...::%(...)";
advice within(remote_call()) && execution(virtual_methods()): before(){
stringstream ss;
ss << "\tcall:" << JoinPoint::signature() << endl;
ss << "\targuments:";
for (size_t i=0; i<JoinPoint::args(); ++i)
{
string arg(tjp->argtype(i));
if (arg.find("basic_string") != arg.npos)
{
ss << *(string*)tjp->arg(i) << "|";
}
}
string send_str = ss.str();
tjp->target()->send (send_str.c_str(), send_str.size());
}
advice within(remote_call()) && execution(virtual_methods()): after(){
vector<char> buffer(1024, '\0');
tjp->target()->recv (&(*buffer.begin()), buffer.size());
// 解析接收的数据,远程调用结果写入tjp->result()指向的内存
}
};
它匹配所有从RemoteCall上派生的类,为它的每个方法加入远程调用代码以及调用结果处理代码。 生成并编译运行,输出如下:
connect success
send:
call:bool RemoteLoginService::login(const ::std::basic_string< char > &,const ::std::basic_string< char > &,::std::basic_string< char > &)
arguments:lijie|lijie||
send:
call:void RemoteLoginService::logout(const ::std::basic_string< char > &)
arguments:|
由于完整序列化了各个参数值,第一个目标——生成远程调用代码——算是完成了。
下一个目标,考虑服务端如何编写?服务端需要开启一个服务,并注册各个服务接口。
要达到这个目标,aspect c++需要提供类、方法级别的类型及名称获取,不过aspect c++在这方面没有提供更多方便,现在只能在方法执行时获得方法的信息,它所生成的“元信息”过于简单,而且为了效率考虑都实现为各个独立的结构,结构的成员也大都是static的,所以无法使用一个合适的接口来反射,期待以后能加入这些特性。
所以这第2个目标实际上无法简单地完成,除非在服务端手工添加服务注册代码,这个部分工作量稍小,但还是可以做到的。
相关推荐
在本主题中,“基于AOP技术的应用层C++进程恢复”探讨了如何利用AOP在C++应用程序中实现检查点和恢复功能,以确保进程的稳定性和可靠性。 在C++中,传统的编程方式往往难以有效地处理非功能性需求,如日志记录、...
AOP通过引入切面(Aspect)、通知(Advice)、连接点(Join Point)、切点(Pointcut)等概念,将这些关注点模块化,提高了代码的可重用性和可维护性。 在这个"AOP面向切面架构设计Demo"中,我们很可能会看到一个...
AOP作为一种编程范式,极大地提升了代码的可维护性和灵活性,尤其适合处理那些跨越多个模块的通用功能需求。通过Spring框架提供的AOP支持,开发者能够轻松地在实际项目中应用AOP技术,实现诸如日志记录、性能监控等...
- **Aspect-Oriented Programming (AOP)**:一种编程范式,允许在不修改源代码的情况下,插入跨切面关注点,如日志、事务管理等,与打桩有相似之处。 - **Code Instrumentation**:专门用于动态修改代码的技术,常...
面向方面的程序设计(Aspect Oriented Programming,AOP)是一种编程范式,旨在将软件系统中的关注点进行分离,使得代码更模块化、可维护性更强。AOP在传统的面向对象编程(Object Oriented Programming,OOP)基础上...
面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在解决软件开发中的横切关注点,如日志记录、事务管理、权限检查等,将这些分散的代码集中管理,提高代码的可读性和可维护性。AOP在传统OOP的...
综上所述,《使用面向切面编程进行可信软件开发》这本书深入探讨了AOP如何应用于软件开发过程中,通过具体的案例和技术实践指导读者如何利用这种编程范式构建更可靠、更安全的软件系统。对于从事软件开发工作的专业...
此外,还详细介绍了如何利用.NET 3.5的新特性和服务,如 LINQ(Language Integrated Query)来增强数据查询能力,以及如何使用AOP(Aspect-Oriented Programming)实现横切关注点的解耦。 总的来说,《Pro Visual ...
- **增强代码可读性和可维护性**:通过将横切关注点从业务逻辑中分离出来,Spring AOP提高了代码的可读性和可维护性,使得业务逻辑更清晰。 #### 结论 Spring框架通过其强大的AOP支持,使开发者能够在开发复杂的...
在IT行业中,依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)是两种重要的设计模式,它们能够帮助我们编写更灵活、可维护和可测试的代码。Unity是一个流行的.NET...
动态代理的应用场景非常广泛,例如在 AOP(Aspect-Oriented Programming)中,动态代理可以用来实现日志记录、安全检查、缓存等方面的功能。 在本文中,我们通过一个简单的例子来演示动态代理的实现。我们定义了一...
AOP是一种编程范式,旨在通过将关注点分离,提高代码的可维护性和可重用性,使得程序员可以更方便地实现如日志记录、性能监控、异常处理等跨切面的功能。 1. **面向切面编程(AOP)** AOP允许开发者定义“切面”,...
至于C++源码,Spring框架本身并不直接包含C++代码,但在某些场景下,如与C++库集成或性能优化时,开发者可能会结合C++编写部分组件。这需要具备跨语言编程的能力,并理解如何在Java和C++之间建立桥梁。 综上所述,...
通过将AOP的概念映射到形式化模型,可以更准确地分析和验证代码的行为,从而提高软件的可靠性和稳定性。 总之,面向方面软件开发通过分离关注点,提高了软件的可维护性,但同时也带来了学习和调试的挑战。形式化...
- **Spring框架**:IOC(Inversion of Control)和AOP(Aspect-Oriented Programming)的核心概念。 4. **面试常见问题**: - 数据结构:链表、树、图、堆、队列、栈的实现与操作。 - 算法:排序(快速、归并、...
AspectC++ 是一种扩展了标准C++的编程语言,它引入了面向方面的编程(AOP)概念,使得程序员可以更方便地处理横切关注点,如日志、事务管理、性能监控等。在传统的OOP中,这些关注点通常会分散在各个类和方法之间,...
本实例重点探讨的是基于Spring框架和Hessian协议的Web Service实现,这是一种轻量级、高效的远程调用解决方案。 首先,我们要理解Spring框架。Spring是Java领域的一个核心框架,它提供了全面的编程和配置模型,用于...
5. **Spring框架**:Spring是企业级Java应用的核心框架,提供了IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等特性。IOC允许对象由Spring容器管理,而AOP则用于实现横...
- **企业级服务支持**:Spring.NET提供了对事务管理、数据访问、远程调用等企业级服务的支持,简化了复杂应用的开发过程。 - **与其他框架集成**:Spring.NET能够很好地与其他.NET框架如ASP.NET、Entity Framework等...
22. **JNI (Java Native Interface)**:JNI允许Java代码与其他编程语言(如C和C++)进行交互,实现本地方法调用。 23. **SableVM**:SableVM是一个用C语言编写的开源Java虚拟机实现。 理解这些术语对于Java开发者...