QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 793|回复: 8

[讨论] : 对象持久化过程中,对每个对象存储过程的控制问题

[复制链接]
发表于 2003-5-25 20:36:37 | 显示全部楼层 |阅读模式
在对象持久化(对象序列化?我不知道有什么区别)过程中,我要遍历一个图结构,对每个节点调用 write() 方法,然而这是基于C++的多态特性的,这就意味着在遍历过程中只知道下一个要调用的对象一定是某个基类的派生类,但具体是什么类就不知道了,所以调用过程中难以以统一的格式加入参数,这样单独控制每个对象的存储过程就比较困难了。于是我想到把控制存储过程的参数封装到各个类当中去,作为成员变量,这样就可以分别控制不同对象的存储过程了;然而这样还有问题,我需要既能单独控制每个对象的存储过程,也能对所有对象(或某一些对象)进行统一的控制(使用相同的参数),于是我又想到每个对象的参数并不封装在对象内部,而是使用指针引用外部的参数,这样可以让所有对象(或者某些对象)使用同一个参数,而且修改这个参数后可以同时反映在对其进行引用的所有对象上,而且不同类的实例如果有相同类型的参数并且控制的也是相同的存储特性,那么不同类的实例也可以在一定程度上进行统一的控制;这样又多出一个问题,这么多的指针该如何管理?而且如果一些参数是C++提供的类型(比如int、float、char等),全部使用指针操作似乎感觉怪怪的,使用时的感觉很重要,会影响到推广时的难易程度(我开发的是一个开发库),大量指针的使用也有一定的风险和我说不出的感觉上的隐患,而且这种设计我现在还想不出办法来封装好,毕竟是开发库,不能随随便便的。

大家有什么想法都来参与讨论吧,我已经苦想了好多天了~~~先谢谢各位了~~
发表于 2003-5-26 09:56:53 | 显示全部楼层
我觉得很奇怪 为什么要做什么参数呢? 实际上根据你的第一部分的描述使用write就可以了阿 无论如何 父类里不要实现真正的write功能 作为一个徐函数好了 这样即使你的图节点指针类型转为了父类的 调用write的时候 也是会使用子类的真正的write函数的
回复

使用道具 举报

 楼主| 发表于 2003-5-26 13:05:05 | 显示全部楼层
是的是的,是使用多态来完成调用,可是每个节点在存储时可能会有不同的参数来控制其过程的!而且关键是这些节点所属的类会是别人写的,我不知道会有什么参数的!
http://www.clinux.org/forum/showthread.php?threadid=3204
这是我在www.clinux.org里的讨论,你可以去看看~~
在csdn里发的帖子到现在都没人回复!!
回复

使用道具 举报

发表于 2003-5-26 13:12:59 | 显示全部楼层
从不指望csdn 那里太滥了
你能不能给一个使用的例子阿 我对opengl的应用完全不了解 不过对c++有些了解 看看能不能想出个比较好的解决方法
回复

使用道具 举报

 楼主| 发表于 2003-5-26 22:17:12 | 显示全部楼层
2003-05-25 21:24:09  0821
http://www.clinux.org/forum/showthread.php?threadid=3204
(通过服务器中转)

2003-05-25 21:24:13 Bin Chen
现在没空,待会再说

2003-05-25 21:25:08  0821
all right

2003-05-25 21:29:47 Bin Chen
ok,see

2003-05-25 21:30:37  0821
hehe
thank you ~~

2003-05-25 21:34:22  0821
回复了
老大,你……

2003-05-25 21:36:08 Bin Chen
灵活控制?

2003-05-25 21:36:53  0821


2003-05-25 21:37:27  0821
其实和保存对象本身没关系~~

2003-05-25 21:36:47 Bin Chen
运行期类型查看行不?

2003-05-25 21:38:17  0821
那怎么管理参数呢?会有很多个对象,它们可能使用相同的参数,也可能使用不同的参数,更何况还会是很多不同类型的对象~

2003-05-25 21:38:39 Bin Chen
只能对不同的对像写不同的保存过程啊,然后通过一个统一的函数做为接口,在这个函数中进行对象类型判断,然后调用相应的保存过程

2003-05-25 21:40:48  0821
不是这个问题 ^_^
对于相同类型的对象,它们的存储函数接口是一样的,但是可能会使用不同的参数,当对象很多时该如何管理这些参数??

2003-05-25 21:40:54 Bin Chen
对象的参数是作什么用的?

2003-05-25 21:42:02  0821
我说的存储函数的参数:)

2003-05-25 21:41:35 Bin Chen
存储函数的参数是作什么用的?

2003-05-25 21:44:52  0821
我不知道 ;)
这是由创建这个类的人决定的,我只提供一个从对象外部管理一披对象存储工作的功能
比如,一个三维模型类,可以有参数控制存储时是否把模型的空间姿态信息恢复成读取时的状态

2003-05-25 21:45:19 Bin Chen
sorry,我不明白你的意思,你在论坛上把伪代码给出来吧,我想没人懂你的意思,或许你在钻牛角尖:(

2003-05-25 21:49:12  0821
发了

2003-05-25 21:50:48 Bin Chen
你要保存当前节点的状态?
“某个类”就是节点的类?


2003-05-25 21:51:54  0821
图中一个节点就是一个类的实例

2003-05-25 21:51:36 Bin Chen
然后“某个类”是别人写的?

2003-05-25 21:52:20  0821


2003-05-25 21:52:44  0821
他给出一个成员函数:
write(void)
供我调用

2003-05-25 21:52:08 Bin Chen
那这个类在哪里调用你的库?

2003-05-25 21:53:58  0821
是别人调用我的接口来保存一个图
然后我的库调用别人的类提供的存储方法的接口来保存某个对象

2003-05-25 21:54:29 Bin Chen
噢。就是说他调用你的库的时候传了一个this指针,然后你再用this指针调用他的write

2003-05-25 21:56:07 Bin Chen
go on,这里你只是一个过渡,好像没什么作用,你的库的作用是什么?

2003-05-25 21:57:44  0821
不是~~
比如我有一个(相当于图的)对象:Scene,别人使用Scene.add(myObj* m_obj)来加入节点,然后他可以调用Scene.save(String file_path)来保存这个图,而Scene.save(String file_path)中会调用每个节点的write(void),这些write(void)都是相应类的作者提供的


2003-05-25 21:58:40 Bin Chen
我是这么理解的啊。
你的write不可能没有参数吧,要不然怎么知道往哪里保存。

2003-05-25 22:01:25  0821
我的库就是my3Dgui,比如我提供了一个类myModel,可以用来管理一个三维模型的数据,你可以通过继承继承出你自己的类myRobot并加入一些和机器人有关的成员函数和成员数据,然后你再写个write(void)就可以不管它了,使用myRobot建立的对象仍然可以让我的Scene对象来管理,调用Scene.save(String file_path)时,你的Robot对象也可以保存下来,这样当你增加新的类时,场景管理的代码不会受到太大的影响


2003-05-25 22:02:38  0821
write当然要有参数,但如果从对象外部给出就有些麻烦,我就想把参数作为对象的成员数据给封装在对象里面

2003-05-25 22:02:05 Bin Chen
是啊,你已经做到了嘛!

2003-05-25 22:03:46 Bin Chen
你同样可以轻易做到啊。因为write每个类都有,且不一样嘛?

2003-05-25 22:04:45  0821
没有啊
如果把参数封装在对象里面,会有麻烦的,比如我要在保存时给所有对象一个相同的参数(和此时对象里的参数不同),就得遍历整个图对每个对象的这个数据成员赋值,这就很麻烦了~~

2003-05-25 22:05:03 Bin Chen
我觉得只有这样

2003-05-25 22:05:55  0821
go on

2003-05-25 22:06:07 Bin Chen
没别的办法。
放在外面我还没明白是哪里?

2003-05-25 22:08:02  0821
其实放在外面的话我也不知道怎么办,似乎基本不可行
但放在里面的话,一些统一的存储控制会比较麻烦

2003-05-25 22:08:56 Bin Chen
没办法,只能那样。再想想吧

2003-05-25 22:10:31  0821

唉,想了好多天了,而且效率低下,郁闷啊~~~
回复

使用道具 举报

发表于 2003-5-26 23:53:44 | 显示全部楼层
看不懂……

随便说一句:我的经验是:能行的方案就是好方案。
一开始不能考虑太多效率等问题,否则是设计不出方案的
回复

使用道具 举报

 楼主| 发表于 2003-5-27 13:04:19 | 显示全部楼层
[quote:2e5b06ef5d="raynorli"]看不懂……

随便说一句:我的经验是:能行的方案就是好方案。
一开始不能考虑太多效率等问题,否则是设计不出方案的[/quote]

我的经验是:只为满足功能而匆忙设计的方案经常会出现严重的扩展方面和可维护性方面的问题。还是谨慎点好~~
回复

使用道具 举报

发表于 2003-5-27 13:32:24 | 显示全部楼层
谨慎点好 方案决定了一切
不过上面的那是什么 qq记录??
回复

使用道具 举报

 楼主| 发表于 2003-5-27 21:41:07 | 显示全部楼层
对,是当晚我和www.clinux.org上的sunwen讨论的内容,里面红色的字是我举的例子,我想也许你看看这些能明白我的意思~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 19:27 , Processed in 0.045236 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表