`
jimmy_c
  • 浏览: 15178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

DataProxy实现

阅读更多
写了一个小东西,用于实现DataProxy机制,暂时还处于试验阶段:


class TestDataObjectDeclaration : public Test
{
public:
	TestDataObjectDeclaration();

public:
	virtual bool RunTest();
};

const int DEFAULT_VALUE_OF_BASE_X = 4;
const int DEFAULT_VALUE_OF_X = 5;

class MyBaseObject
{
public:
	MyBaseObject() : _x(DEFAULT_VALUE_OF_BASE_X)
	{}
public:
	int _x;
};

class MyDataObject : public MyBaseObject, public archer::oi::DataObject<MyDataObject, MyActionProxy>
{
public:
	MyDataObject() : _x(DEFAULT_VALUE_OF_X)
	{}
public:
	int _x;

public:
	const type_info& func()
	{ return ((const archer::oi::rtti_derived_class<MyDataObject>&) this->GetRuntimeTypeInfo()).typeidof(); }
};

DECLARE_RTTI(MyDataObject)
	DECLARE_SIMPLE_RTTI_ITEM_OF_BASE(MyDataObject, MyBaseObject, _x, int, 0, "b_x")
	DECLARE_SIMPLE_RTTI_ITEM(MyDataObject, _x, int, 1, "x")
END_DECLARE_RTTI

TestDataObjectDeclaration::TestDataObjectDeclaration() : Test("testDataObjectDeclaration") {}

bool TestDataObjectDeclaration::RunTest()
{
	MyDataObject obj = MyDataObject();

	char buffer[256];
	sprintf(buffer, "size of MyDataObject: [%d]", sizeof(MyDataObject));
	this->PromptMessage(buffer);

	if (!AssertEquals(std::string(obj.func().name()), std::string("class MyDataObject"), "Get wrong type id from rtti."))
		return false;

	if (!AssertEquals(DEFAULT_VALUE_OF_X, obj.GetData<int>(1), "Failed to get data by rtti."))
		return false;

	if (!AssertEquals(DEFAULT_VALUE_OF_BASE_X, obj.GetData<int>(0), "Failed to get data of base class by rtti."))
		return false;

	const int CHANGED_VALUE = 10;
	obj.SetData<int>(1, CHANGED_VALUE);
	obj.SetData<int>(0, CHANGED_VALUE);

	if (!AssertEquals(CHANGED_VALUE, obj.GetData<int>(1), "Failed to set data by rtti."))
		return false;

	if (!AssertEquals(CHANGED_VALUE, obj.GetData<int>(0), "Failed to set data of base class by rtti."))
		return false;

	return true;
}



优点是用户类MyDataObject的代码侵入很少,DataObject类可以用于多继承。data member的调用已经很类似于script语言了,GetData,SetData还可以按name查找。
缺点是data member必须为public,以及类似script语言的效率低的问题。目前rtti中,data member的声明是放在一个列表里,每次GetData, SetData时需要对列表遍历。还没有想到什么改进的办法,hash表当然是可以的,弄两个hash表把每个rtti_item存起来。但更希望有template直接的解法。

==============================================================================

早上起来花了点时间,把上面提的关于效率问题的功能实现了。现在
GetData和SetData分别变成了
GetData<0, int>();
和SetData<0, int>(CHANGED_VALUE);
而用name做index似乎是无法模板化的。所以name的list查找机制依旧保留。
分享到:
评论

相关推荐

    EXT核心API详解.doc

    24. **HttpProxy类**、**MemoryProxy类**、**ScriptTagProxy类**:具体的DataProxy实现,分别对应不同的数据加载方式。 25. **Ext.data.DataReader类**:解析服务器返回的数据,如ArrayReader、JsonReader、...

    DataProxy

    单独使用时可实现局域网内据库之间的同步/集成,亦可与数据总线服务器配合使用实现Internet内跨地域数据库之间的同步/集成。特点:无需编程、两数据库字段不同可转换等。例如:进销存系统与财务系统之间的数据库同步/...

    数据代理DataProxy

    单独使用时可实现局域网内据库之间的同步/集成,亦可与数据总线服务器配合使用实现Internet内跨地域数据库之间的同步/集成。特点:无需编程、两数据库字段不同可转换等。例如:进销存系统与财务系统之间的数据库同步/...

    js实现数据双向绑定

    **JavaScript 实现数据双向绑定** 数据双向绑定是前端开发中的一个重要概念,它使得视图(View)和模型(Model)之间的数据保持同步,当模型改变时,视图自动更新,反之亦然。这一特性在现代Web应用框架如Angular、...

    ExtJS5学习之Grid与Grid之间的数据拖拽

    通过阅读和理解给出的"extjs5DragDemo"压缩包中的代码,我们可以看到具体实现的细节,如拖放配置、事件处理函数、DataProxy的定义等。这对于开发者调试和定制自己的拖放功能非常有帮助。 总之,理解并实现ExtJS 5中...

    PureMVC实现与实践——教程.pdf

    registerProxy(new DataProxy()); registerMediator(new MyMediator()); // 注册其他核心组件... } } ``` - **初始化Façade**:通常在应用程序启动时初始化Façade,以确保所有核心组件都已正确注册。 **2. ...

    flex组件拖拽框架

    Flex组件拖拽框架是一种在Adobe Flex环境中实现的交互设计技术,允许用户通过鼠标操作将组件在界面上自由移动,从而提升用户体验和应用的可操作性。这个框架通常由一系列类和方法组成,用于处理拖放事件,跟踪鼠标...

    fastCSharp

    .getArray(value =&gt; new KeyValuePair&lt;diantou.dataProxy.user, int&gt;(diantou.dataProxy.user.get(value.Key), value.Value.Count)) .group(value =&gt; value.Key.grade0) .getArray(value =&gt; new userStat { ...

    99-云上数据集成的产品及相关实践.pdf

    - **DataProxy**:作为数据采集和消息队列之间的中间层,负责数据的路由、压缩和协议转换等功能。 - **容灾机制**:当消息队列出现异常时,DataProxy能够将数据缓存到本地磁盘,确保数据不会丢失。 - **时延优化**:...

    ExtJs 实现动态加载grid完整示例

    `Store`是ExtJs中的数据容器,它可以连接到DataProxy,DataProxy负责从服务器获取数据。在动态加载的情况下,通常使用`AjaxProxy`,因为它可以异步请求数据。同时,我们需要定义`Model`来描述数据结构,这里对应的是...

    VS2008调用RFC接口教程

    - 编写代码实现所需功能,通常是一个简单的SQL查询。 - 检查语法错误并激活函数模块。 - 最后,释放函数模块使其可在SAP.NET Connector中使用。 #### 二、安装与配置SAP .NET Connector ##### 1. 安装SAP .NET ...

    小程序数据代理

    在微信小程序中,我们可以创建一个单独的数据管理模块,如`dataProxy.js`,在这个模块中,我们可以定义数据的获取、设置和监听方法。例如,我们可以定义一个`get`方法用于读取数据,一个`set`方法用于更新数据,还有...

    Ext3.2源码、API、及Demo(grid例子)

    EXT3.2的DataProxy和DataReader/Writer则负责数据的序列化和反序列化,实现了JSON、XML等多种数据格式的处理。 总的来说,EXT3.2是一个强大的JavaScript库,提供了丰富的UI组件和数据管理工具。通过深入研究源码、...

    Ext+JS高级程序设计.rar

    7.7 DataProxy 208 7.8 DirectStore 209 7.9 DataWriter 212 7.10 Ext.data.Api 212 7.11 本章小结 213 第三部分 Ext-UI 第8章 Ext用户界面控件 216 8.1 布局 216 8.1.1 在FormPanel中使用HBoxLayout进行布局 216 ...

    extjs tree 节点 链接 新窗口

    你可以通过为TreeNode添加扩展属性,如`href`和`hrefTarget`来实现这一功能。例如: ```javascript var node = new Ext.tree.TreeNode({ text: '节点文本', href: 'http://example.com', hrefTarget: '_blank' }...

    extjs中文教程

    本部分讲述了Ext.data相关类的使用,包括Ext.data.DataProxy、Ext.data.DataReader和Ext.data.Store类,以及如何实现下拉列表框,如何获取下拉列表框的值。 ### 第十部分:Ajax与ComboBox 在ExtJS中,Ajax的使用...

    深入浅出ExtJS第2版

    4. **Model和DataProxy**:模型(Model)用于封装业务数据,DataProxy则负责与数据源通信。这部分内容将解释它们如何协同工作,确保数据的正确性和一致性。 5. **视图(View)与控制器(Controller)**:在MVC模式下,...

    pureMVC简单例子

    - **Proxy**:这个目录下可能包含了`Proxy`子类,例如`DataProxy`,它负责与数据源交互并管理数据。 - **Mediator**:可能包含如`MainWindowMediator`这样的类,它实现了对UI组件的监听和交互。 - **Command**:这里...

    ExtJS使用笔记

    Ext.data.Store需要与数据代理Ext.data.DataProxy配合,后者定义了从内存或网络获取数据的方式。同时,Ext.data.DataReader负责将原始数据转换为Store可以使用的形式,而Ext.data.DataWriter则负责将数据保存到...

Global site tag (gtag.js) - Google Analytics