我正在编写一个perl脚本来解析mysql数据库模式并在必要时创建C ++类。我的问题很简单,但我们之前没有做过的事情,也不知道常见的做法。创建的任何类的任何对象都需要使用“get”方法来填充此信息。所以我的问题有两个:
我可以在#1上双向前进,并且在#2上倾向于是。任何建议,指针将非常感激。
答案 0 :(得分:2)
通常,应用程序中最昂贵的部分是到数据库的往返,因此从单个查询填充所有数据成员比一次执行一个查询要高效得多,或者根据需要基础或来自您的构造函数。一旦你支付了往返费用,你也可以获得你的钱。
此外,一般来说,你的get *方法应该被声明为const,这意味着它们不会改变底层对象,所以让它们去数据库来填充对象会破坏它(你可以通过制作成员变量是可变的,但这基本上会破坏const的目的。
为了将事情分解为具体步骤,我建议:
答案 1 :(得分:1)
首先要意识到你在这里重新发明了轮子。几乎所有语言都有许多适合数据库访问的对象关系映射库。对于C / C ++,您可以查看:
http://trac.butterfat.net/public/StactiveRecord
http://debea.net/trac
好的,除此之外,你可能想在你的类中创建一个名为find或search的静态方法,这是一个用于构造对象并从数据库中选择它们的工厂:
Artist MJ = Artist::Find("Michael Jackson");
MJ->set("relevant", "no");
MJ->save();
请注意save方法,然后获取修改后的对象并将其存储回数据库。如果你真的想要创建一个新记录,那么你将使用new
方法来实例化一个空对象:
Artist StackOverflow = Artist->new();
StackOverflow->set("relevant", "yes");
StackOverflow->save();
注意这里的set和get方法只是设置并从对象而不是数据库中获取值。要在数据库中实际存储元素,您需要使用静态Find
方法或对象的save
方法。
答案 2 :(得分:0)
现有的工具可以将db转换为java(可能还有其他语言)。考虑使用其中一个并将其转换为c ++。
答案 3 :(得分:0)
除非您的特定问题绝对必要,否则我不建议您将get方法转到数据库。它会使更多地方出现问题,并且可能会对您的数据库进行大量不必要的读取,并且可能无意中将您的对象绑定到特定于数据库的功能,从而失去了分层体系结构的许多好处。就您的域模型而言,数据库不存在。
编辑 - 这是#2(显然)。对于#1,我会说不,原因有很多。
答案 4 :(得分:0)
另一种选择是不自动创建类,而是创建仅包含单个可执行文件感兴趣的数据成员的单独类,以便这些类仅提取必要的数据。
不知道我们谈论了多少个表,所以这可能会破坏你项目的范围。