c++ 的 OR,有兴趣没有?

onemonth 2005-10-30 11:54:51
2年前用c++做了一个OR库,准备在这里随便瞎说一番,不知道各位有兴趣没有?
...全文
370 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
学习Java中 2005-11-18
  • 打赏
  • 举报
回复
up
zjqwhy 2005-11-16
  • 打赏
  • 举报
回复
我有兴趣,可以讲下具体的吗。
onemonth 2005-11-16
  • 打赏
  • 举报
回复
开始设计的时候,想用ref的。但是最终放弃这个方法。由于有了一个creator,以及queryCreator,这个ref已经不是必须的了。因为成员属性意义不大,定义一个映射文件,object可以直接映射到相应的字段。现在准备做一个函数ref,这个意义就大了。
Eastunfail 2005-11-16
  • 打赏
  • 举报
回复
http://www.blogcn.com/user53/lexchou/blog/24316262.html

这是我以前写的给C++添加属性以及反射属性的方法
leonatcs 2005-11-07
  • 打赏
  • 举报
回复
讲讲,听着呢。
onemonth 2005-11-07
  • 打赏
  • 举报
回复
还有一个问题忘了说,是关于QueryCreator的。
如前所述,没有定义AfterXXX的事件,当然也不会定义OnCal之类的事件。这里有两个办法,一个是多个类交互,但是这个东西比较繁琐。如果效率要求高就麻烦了。这就是QueryCreator出马的时候了。这个TORObject是支持虚字段的。比如select emp_name, emp_name+’1’ as name_alias from emp,那么这个对象完全可以用 emp->SetAliasName(“alias_name”); emp->Save();保存的时候,自动忽略这个虚拟字段。显然,这样方便很多了。
还有一个就是关于自定义数据库I/O部件。这个部件是个template,它也能返回一个TDataSet,就看你怎样定义这个部件的输入参数了。这个I/O中定义了一个 impl_data_set类型,用 ORCreat::impl_data_set就行了。反正这个是由开发人员自己定义的,提供这个类别就ok。
onemonth 2005-11-07
  • 打赏
  • 举报
回复
没有meta数据,不能做到如java,c#这类的反射。那么怎样才能持久化呢?只有通过继承了――我们需要有一个基类。这个基类不包含任何的企业逻辑,只是专著于和数据库打交道。由于没有反射,那么具体对象是不可知的,对象显然就没办法象其他or库那样生成,我们必须得为每种实际对象定义一个Creator。与java,c#比较,麻烦很多,是不是?别着急,template显身手了。我们可以定义一个缺省的functor,用来生成实际对象。如果你的对象特殊,换一个functor就好了,是不是比java,c# 的对象必须是无参数constructor要强大?也许你要说了,你可以忍受这个限制,但是每种对象都要有一个creator,不如一个session来得爽快。确实,这是个问题。但是通过一种对象对应一个creator,有个最大的好处:很轻易的就可以用 StoredProc 来读写你的对象数据!这个特征可是hibernate3才有的,而且还是一个亮点!两相比较,显然我宁愿采用这样的方式。即使c++提供反射功能,我还是会采用这样的结构体协。同样,这个也可以用template来简化,根本不需要在编码中一一对应,编译器已经替我们做了。好,让我们再定义一个ObjectFactory,完全做到与session相同的效果。说到底,这个ObjectFactory和session是差不多的机制,其差异就是,我们自己编写代码来实现类似Ref的功能而已。我们所做的就是注册类型,然后产生对象。相比之下,是比java是多了一些代码,但是效率高,内存占用少。

Creator说完了,再来说说object的问题。由于没有反射,对 Object 的实际类型确实没办法知道。一个就是用继承,继承上面所说的基类。另一个办法就是聚合。这两种办法都需要自己写代码。相比之下,继承要方便一些,但是有些违背policy的原则。不过嘛,实际高于一切,我以为。如果这个地方有反射就比较爽,可以少写一些代码。算了,还是让代码生成器出手吧。当然,基类需要知道派生类的数据,怎么办?Variant?No!坚决不用这个东西,我可不想为这么一点小事就让代码变得不可移植。首选当然是boost的any了。不过有点遗憾,bcb6和any似乎有点不兼容。多几次Any的赋值操作,就会报access failed。没检查出来到底是哪个地方的错。分析一下数据库内容,显然数据库中的信息,大多数是文本,数字,还有就是bin了。不用any了,用union,很轻易的就对付了这个问题,而且效率高,内存占用少。:)如果以后会在数据库中持久化对象,再用any不迟。Boost是通过了Bcb5测试的,换回bcb5好了。:)))

查询显然是很重要的问题。于是这个or类库,不能不包含这个QueryCreator,用来产生查询的。这个查询包含了各种情况,支持各种sql表达式。最大的问题就是缺少一个GUI的界面,没精力了。但是核心还是比较的不错。

由于windows下数据库操作的方式很多,没有java那样一个统一的Jdbc,而且为了可移植,是不能用TdataSet的。自己没办法偷懒,定义一个吧。还好,这个定义很简单,就一个Open,一个Save,一个Delete。可能你又要问了,那么些AfterXXX,BeforeXXX难道不定义?是的,不定义,因为这个东西完全可以不用的。这个类方法也很少,除了上面三个方法,还有就是SetValue,GetValue就行了。同样,这是一个template类,你完全可以用TdataSet来实现。我只用ADO实例化了这个类。

好了,大致就这么些了。看看一个例子:
typedef TORCreator<TDepartment> department_type;
typedef department_type::iterator department_iterator;

typedef TORCreator<TEmployee> employee_type;
typedef employee_type::iterator employee_iterator;

class TDepartment : public TORObject
{
public:
TDepartment();
~TDepartment();
TEmployeeCreator * GetEmployees();
TEmployee * GetEmployee(string name);
string GetName()
{
return GetValue(“department_name”);
}
void SetName(string name)
{
SetValue(“department_name”, name);
}
};


class TEmployee : public TORObject
{
public:
TJpeg * GetPhotn()
{
return GetValue(“photo”);
}
void SetPhoto(TJpeg * photo)
{
SetValue(“photo”, photo);

}
}

department_type * department = new department_type();
TDepartment * dp = new TDepartment();
dp->Persistent(department);
dp->SetName(“Test Department”);
dp->Save();

TEmployee * emp = department->GetEmployee(“jhwh”);
TJpeg * jpg = emp->GetPhoton();
DealWithJpg(jpg);
emp->SetPhoto(photo);
emp->Save();

ok,大致就这样了。本文只是一个描述,没有涉及具体过程。只是开了这个帖子,没多大响应,也就这样说说罢。

Mr_Yang 2005-11-06
  • 打赏
  • 举报
回复
学习ing!
onemonth 2005-11-02
  • 打赏
  • 举报
回复
楼主是不是指类似于java中的hibernate、ojb的东西?
or -- 即指对象关系影射
--------------------------
就是这个东西。
caizhen2000_82 2005-11-01
  • 打赏
  • 举报
回复
介绍一下也好啊!!
学习
keen_blue 2005-11-01
  • 打赏
  • 举报
回复
楼主是不是指类似于java中的hibernate、ojb的东西?
or -- 即指对象关系影射
alloutoflove 2005-11-01
  • 打赏
  • 举报
回复
我还以为是指"|"或者"||"呢=_=
setdefault 2005-10-31
  • 打赏
  • 举报
回复
什么是OR库?楼主做的?
netsys2 2005-10-31
  • 打赏
  • 举报
回复
详细介绍一下呢。
FengSC 2005-10-31
  • 打赏
  • 举报
回复
没怎么看懂,不过还是有兴趣

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧