私はdbにシリアル化されたオブジェクトを持っています。クラスの他のプロパティから実行時プロパティを分離する方法に関するベストプラクティス
問題は、実行時プロパティ(最後の実行時間など)を同じクラス、別のクラス、または派生クラスで保持する場所ですか?このシナリオのベストプラクティスは何でしょうか?オブジェクト電車
プロパティ:タイプ、体重、身長、速度など
実行時:たとえば:旅行開始日、旅行終了日
私はdbにシリアル化されたオブジェクトを持っています。クラスの他のプロパティから実行時プロパティを分離する方法に関するベストプラクティス
問題は、実行時プロパティ(最後の実行時間など)を同じクラス、別のクラス、または派生クラスで保持する場所ですか?このシナリオのベストプラクティスは何でしょうか?オブジェクト電車
プロパティ:タイプ、体重、身長、速度など
実行時:たとえば:旅行開始日、旅行終了日
今追加した例を見ると、それらを移動し、代わりにカプセル化を使用するといいでしょう。つまり、「実行時」プロパティ(実際にはここで適切な用語ではありません)を持つTrainJourneyクラスと参照あなたのデータエンティティであるTrainインスタンスに追加します。
データエンティティに追加のプロパティ(通常は部分クラスに含まれる)を追加することは、データエンティティに直接関連付けられていればOKです。これは通常、計算値、遅延/キャッシュされた値、解釈(Status == Status.OpenではなくIsOpenなど)を意味します。
あなたの場合、余分なプロパティはと関連していませんのコンセプトです。懸念を分けることで、あなたはそれをあなたのTrainクラスに混ぜて混乱させてしまいます。だから:しないでください。
私は以下のクラス構造を使用します私はあなたと仮定を更新しました
標準のシリアライザを使用しています。属性を使用してどのプロパティがシリアル化されているのかを示すことができます。シリアライゼーションの一部として永続化されるべきものだけをマークしてください。
私は、データベースに保存するためにシリアライズを使用するソリューションは、本当に考えなければならないと思います。関連性がある場合もありますが、オブジェクトのプロパティをデータベースの列にマップするほうがずっと優れています。
OPはシリアル化ではなく「永続化」を意味するかもしれませんが、私は同意します:) –
:(「プライベート/パブリック」と簡潔にするために除外プロパティ)
// describes the run schedules
class RunSchedule {
int RunScheduleId; // only used by DB to uniquely identify record, never seen by user
int RunId;
DateTime StartTime;
}
// describes the runs, so repeat runs do not duplicate this information
class Run {
int RunId; // only used by DB to uniquely identify record, never seen by user
string Name; // unique run name as known by everyone, eg. "Chicago express"
Train Train;
string StartLocation;
string EndLocation;
TimeSpan Duration;
}
// describes the train-specific information, without duplicating anything
class Train {
int TrainId; // only used by DB to uniquely identify record, never seen by user
string Name; // unique train identifier as known by everyone
TrainType Type;
}
// describes the train-common information, shared across trains of the same type
class TrainType {
int TypeId; // only used by DB to uniquely identify record, never seen by user
string Description;
double WeightMetricTonnes;
double HeightMetres;
double SpeedKms;
}
また、長さ、速さ、重量などのようなものについて話すとき、私は、示されてきたようにユニットを明記してください。 私はおそらくこれらに状態を追加するので、時代遅れの走りや電車などはデータ入力中に隠すことができます。
「ランタイムプロパティ」ではないものを策定しておく必要があります。 .NETには「デザイン時」のプロパティがあり、WPFとWinformsにはデザイナーがいます。コードジェネレーターは、ユーザーの代わりにコンピューターで実行されます。それがどのように関連しているかは、その質問から推測できません。 –
"シリアライズ"(BLOBまたはCLOBなどとして保存)または "永続化"を意味しますか?また、ここでランタイムプロパティの意味について完全にはっきりしていませんか?あなたが保存する必要のないデータだけを意味しますか? –
@Hansはもちろん*ランタイムプロパティ(ICustomTypeDescriptor、dynamicなど)ですが、これはOPの意味を疑うものです。 –