どのように私は時間をかけて設備/資産を追跡するためのオブジェクトをモデル化するのですか?
-
26-09-2019 - |
質問
私は、このエンティティをモデル化するための最良の方法を把握しようとしてきた、と私は立ち往生しています。ここでは基本的なユースケース/物語だ。
私たちは現場に到着機器を持っています。私たちは、それが到着するまでの機器が何であるかを知ることができません。機器が現場に到着すると、それが到着したと記録され、それがアイドル状態またはアクティブであったかどうかをしなければなりません。それがアクティブである場合、ユーザは、機器が実行される作業のノートを作成する必要があります。機器がサイトを離れたとき、これは注意する必要があります。
私がサイトなどで以前にあったものを機器サイト、上の任意の機器があるかどうかを簡単に問い合わせのことができるようにする必要があります。
私は日付の側面に立ち往生しています。私はそれがpaticular日にアイドルをマークされていない場合はアイドルとしてマーク機器を介して実行するcronジョブに頼らないようにしようとしています。これを行う方法があるはずのようにそれは感じています。ここで私が作ってみたものです。
public class Equipment {
public int Id { get; set; }
public Site Site { get; set; }
public DateTime Arrival { get; set; }
public DateTime Departure { get; set; }
public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
}
public class EquipmentUtilization {
public int Id { get; set; }
public Equipment Equipment { get; set; }
public DateTime ReportDate { get; set; }
public string WorkPerformed { get; set; }
}
私は現場に残っている機器を参照するためにSite.Equipment.Where(x=>x.Departure == null)
のようなクエリを実行することができるとされてアイデア。特定の日付にはEquipmentUtilizationがない場合は、それがアイドル状態になるんと仮定しています。私ができる、セットアップDateTimeEnumeratorます:
public class DateTimeEnumerator : System.Collections.IEnumerable
{
private DateTime begin;
private DateTime end;
public DateTimeEnumerator ( DateTime begin , DateTime end )
{
this.begin = begin;
this.end = end;
}
public System.Collections.IEnumerator GetEnumerator()
{
for(DateTime date = begin; date < end; date = date.AddDays(1))
{
yield return date;
}
}
}
それがnullでない場合は、DateTime.NowまたはDepatureDateまでの到着日から日付のリストを作成します。何らかの理由で、これは醜いようです。万一私は、機器オブジェクトでのDateTime列挙子の内部を置きますか?これは、すべて一緒になるか、いくつかの異なる方法で行う必要があるように私はそれを実行する場合、この作業を行いますけれどもそれは、感じています。提案?
解決
私が正しくあなたを理解していれば、あなたは機器が撮影しequipmentutilizationに基づいて、指定された日付に指定したサイトにアイドル状態にあるかを決定するための方法を模索は、お使いの機器(おそらくEquipmentResidencyが良い名前ですか?)コレクションに関連付けられたオブジェクト。
あなたはどのようにequipmentutilizationクラスにisIdleOn(日)メソッドを追加する方法についてtrueを返すこと、(私はそれが重要なメンテナンス可能性が同意)アイドル日間equipmentutilizationオブジェクトを作成しないようにしたいと渡された日付が撮影しReportDateと偽と一致した場合そうでない場合はどうなりますか?
の関連クエリはSite.Equipment.Whereの線に沿ったものになるだろう(X => x.equipmentutilization.isIdleOn(日付)== TRUE)
わからない私は、構文の権利を持っていますが、あればただの提案ます。
他のヒント
の1つの潜在的な問題は、現在のサイトを知っている機器の一部です。あなたはLoader123は2ヶ月前SiteXYZにあったかどうかを知りたい場合は、あなたの現在のモデルを使用して、その情報を取得することはできません。
使用方法のあなたの粒度は、特定の日のためにあるように、に見えます。機器の一部がSiteABC上の11 pm-4amから使用されている場合は、それを追跡する方法を見つけ出すためにSiteXYZに、その後1 pm-5pmを必要としないとしてそれは間違いなく、物事が簡単になります。
心の中でそれらのもので、私はあなたのモデルに夫婦わずかな変更を行います。私は、機器が(Equipment.History)にあったすべてのサイトのコレクションを維持し、それは(SiteHistory.Departureが値を持っていない方)で、現在のサイトを見つけるために、便利な機能を提供します。使用率自身のために、私は、日時をキー辞書、としてそれらを返すために便利な機能を提供します。あなたは、簡単に機器の一部が実際に与えられた期間内に利用された日数カウントする、その辞書のキーコレクションでの操作を行うことができます。
public class Equipment
{
public int Id { get; set; }
public IList<SiteHistory> History { get; set; }
public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
public IDictionary<DateTime, EquipmentUtilization> UtilizationsDictionary { get{...} }
public Site CurrentSite { get{...} }
}
public class SiteHistory {
public Site Site { get; set; }
public DateTime Arrival { get; set; }
public DateTime? Departure { get; set; }
}
public class EquipmentUtilization {
public int Id { get; set; }
public Equipment Equipment { get; set; } // is this a circular-reference back to the parent? Might be able to omit it.
public DateTime ReportDate { get; set; }
public string WorkPerformed { get; set; }
}
あらゆる間に合わせのn-設計と同じように、私はこの1つは、いくつかの穴があり、いくつかの改良を使用することができます確信しています。しかし、うまくいけば、それはもう少し近くにあなたが探しているものにあなたを取得ます。
私は個人のDateTime列挙子を持っていないでしょう。あなたが言ったように、それは間違って聞こえるます。
私はあなたが何かがアイドルとして分類されなければならないと言ったとき、私はここであなたを追跡するために苦労しています認めなければなりません。何かがアイドル状態の場合、あなたが財産に入れることができ決定するために使用するものは何でも、例えばます:
public class Equipment
{
public int Id { get; set; }
public Site Site { get; set; }
public DateTime Arrival { get; set; }
public DateTime Departure { get; set; }
public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
public bool IsIdle
{
get
{
// This checks if the EquipmentUtilizations is empty
// or if the Equipment is older than three days
return (this.EquipmentUtilizations == null) ||
((this.Departure == null) &&
(this.Arrival < DateTime.Today.AddDays(-3))
}
}
}