3

mysql データベース スキーマを解析し、必要に応じて C++ クラスを作成するための perl スクリプトを作成しています。私の質問は非常に簡単なものですが、これまでに実際に行ったことがなく、一般的な慣行も知りません。作成されたいずれかのクラスのオブジェクトには、この情報を入力するための「get」メソッドが必要です。だから私の質問は2つあります:

  1. オブジェクトがすぐにデータを持つように、コンストラクターですべての get メソッドを呼び出すことは理にかなっていますか? 一部のクラスにはそれらが多数あるため、必要に応じて意味がある場合もあります。私は現在2つのコンストラクターを持っています。1 つはデータを入力し、もう 1 つは入力しません。
  2. データベースのコピーではなく、オブジェクトのデータのコピーを取得する別の「get」メソッドも必要です。

私は #1 で両方の方法に行くことができ、#2 で「はい」に傾いています。アドバイス、指針をいただければ幸いです。

4

5 に答える 5

2

通常、アプリケーションの最もコストのかかる部分はデータベースへのラウンド トリップであるため、必要に応じて、またはデータベースから一度に 1 つずつデータ メンバーを作成するよりも、1 つのクエリからすべてのデータ メンバーを作成する方がはるかに効率的です。あなたのコンストラクタ。往復の料金を支払ったら、お金の価値を手に入れることもできます。

また、一般に、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(およびおそらく他の言語)に逆にする既存のツールがあります。それらの1つを使用し、それをc++に変換することを検討してください。

于 2008-09-17T14:07:47.730 に答える
0

もう 1 つの方法は、クラスの作成を自動化せず、代わりに、個々の実行可能ファイルが対象とするデータ メンバーのみを含む別のクラスを作成して、それらのクラスが必要なデータのみをプルするようにすることです。

ただし、私たちが話しているテーブルの数がわからないため、プロジェクトの範囲が爆発する可能性があります.

于 2008-09-18T14:35:26.810 に答える
0

特定の問題で絶対に必要な場合を除き、get メソッドをデータベースに送信することはお勧めしません。これにより、問題が発生する可能性のある場所が増え、DB で不要な読み取りが行われる可能性が高くなり、オブジェクトがデータベース固有の機能に誤って関連付けられ、階層型アーキテクチャの多くの利点が失われる可能性があります。ドメイン モデルに関する限り、データベースは存在しません。

編集 - これは#2用です(明らかに)。#1については、同じ理由の多くでノーと言えます。

于 2008-09-17T14:10:51.340 に答える