3

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

  1. 调用构造函数中的所有 get 方法以便对象立即拥有数据是否有意义?有些课程会有很多,所以根据需要也可能有意义。我现在有两个构造函数。一种填充数据,另一种不填充。
  2. 我是否还应该有另一个“get”方法来检索对象的数据副本而不是数据库副本。

我可以在#1上双向使用,并且在#2上倾向于是。任何建议,指针将不胜感激。

4

5 回答 5

2

通常,应用程序中成本最高的部分是到数据库的往返,因此从单个查询填充所有数据成员比一次执行一个查询要高效得多,无论是根据需要还是从你的构造函数。一旦您支付了往返费用,您也可以物有所值。

此外,一般来说,您的 get* 方法应声明为 const,这意味着它们不会更改底层对象,因此让它们到数据库中填充对象会破坏它(您可以通过创建成员变量来允许可变的,但这基本上会破坏 const 的目的)。

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

  • 让您的构造函数调用一个单独的 init() 方法来查询数据库并填充对象的数据成员。
  • 将您的 get* 方法声明为 const,然后让它们返回数据成员。
于 2008-09-17T14:24:54.083 回答
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方法。

于 2008-09-17T14:16:06.257 回答
0

有现有的工具可以将 db 转换为 java(可能还有其他语言)。考虑使用其中之一并将其转换为 c++。

于 2008-09-17T14:07:47.730 回答
0

我不建议让您的 get 方法进入数据库,除非您的特定问题绝对必要。它会导致更多的地方出现问题,并且可能会在您的数据库上进行大量不必要的读取,并且可能会无意中将您的对象与特定于数据库的功能联系起来,从而失去分层架构的许多好处。就您的域模型而言,数据库不存在。

编辑 - 这是#2(显然)。对于#1,我会说不,出于许多相同的原因。

于 2008-09-17T14:10:51.340 回答
0

Another alternative would be to not automate creating the classes, and instead create separate classes that only contain the data members that individual executables are interested in, so that those classes only pull the necessary data.

Don't know how many tables we're talking about, though, so that may explode the scope of your project.

于 2008-09-18T14:35:26.810 回答