来自数据库模式的C ++类设计

时间:2008-09-17 13:58:30

标签: c++ mysql database oop class

我正在编写一个perl脚本来解析mysql数据库模式并在必要时创建C ++类。我的问题很简单,但我们之前没有做过的事情,也不知道常见的做法。创建的任何类的任何对象都需要使用“get”方法来填充此信息。所以我的问题有两个:

  1. 在构造函数中调用所有get方法是否有意义,以便对象立即拥有数据?有些课程会有很多,所以根据需要也可能有意义。我现在有两个顾问。填充数据的填充数据和不填充数据的数据。
  2. 我是否还应该使用另一个“get”方法来检索对象的数据副本而不是db副本。
  3. 我可以在#1上双向前进,并且在#2上倾向于是。任何建议,指针将非常感激。

5 个答案:

答案 0 :(得分:2)

通常,应用程序中最昂贵的部分是到数据库的往返,因此从单个查询填充所有数据成员比一次执行一个查询要高效得多,或者根据需要基础或来自您的构造函数。一旦你支付了往返费用,你也可以获得你的钱。

此外,一般来说,你的get *方法应该被声明为const,这意味着它们不会改变底层对象,所以让它们去数据库来填充对象会破坏它(你可以通过制作成员变量是可变的,但这基本上会破坏const的目的。

为了将事情分解为具体步骤,我建议:

  • 让构造函数调用一个单独的init()方法来查询数据库并填充对象的数据成员。
  • 将你的get *方法声明为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)

另一种选择是不自动创建类,而是创建仅包含单个可执行文件感兴趣的数据成员的单独类,以便这些类仅提取必要的数据。

不知道我们谈论了多少个表,所以这可能会破坏你项目的范围。