69

ドメイン オブジェクトのいくつかには、開始日と終了日のプロパティのペアとして日付範囲が含まれています。

public class Period {
  public DateTime EffectiveDate { get; set; }
  public DateTime ThroughDate { get; set; }
}

public class Timeline {
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

そして、私はこれがたくさんあることに気づきました:

abstract public int Foo(DateTime startDate, DateTime endDate);
abstract public decimal Bar(DateTime startDate, DateTime endDate);
abstract public ICollection<C5.Rec<DateTime, DateTime>> FooBar(DateTime startDate, DateTime endDate);

最後に疑問に思ったのは、DateRange クラスを実装する必要があるかどうかということです。私はBCLにあるものを知りません。

私の経験では、オブジェクト階層を深くすると、しばしば事態が複雑になります。これらのオブジェクトは、ReportViewer コントロールによって表示される RDLC レポートに送信されますが、それは二次的なものです。ビューをモデルに曲げますが、その逆ではありません。ただし、プロパティ名に縛られているわけではなく、次のようなもので妥協するつもりです。

public class DateRange {
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

Period p = new Period();
DateTime t = p.EffectiveDateRange.StartDate;

DateRange クラスの利点は、開始日の後に来る終了日を集中的に検証できることです。これにより、メソッド シグネチャが簡素化されます。

abstract public int Foo(DateRange dateRange);
abstract public decimal Bar(DateRange dateRange);
abstract public ICollection<DateRange> FooBar(DateRange dateRange);

DateRange クラスがその価値以上の問題に巻き込まれないかどうかはわかりません。意見?

副次的な質問: BCL のどこかにジェネリック汎用タプル クラスがありませんでしたか? さまざまな名前空間にいくつかの非常に具体的なものが浮かんでいることを私は知っています。パブリック ドメインのメソッド シグネチャを C5 型で汚染することは、非常に汚いと感じます。

4

5 に答える 5

45

いいえ、汎用クラスを欠席したわけではありません。

私はMiscUtilRangeにあなたが興味を持っているかもしれない型を持っています - そしてそれは確かに簡単な操作になります。マークの答えを参照すると、これが構造体なのかクラスなのか思い出せません。もちろん、変更してもかまいません。DateTime

Marc のジェネリックのシェナニガン (少なくとも .NET 3.5 を使用していると仮定すると、2.0 では実行可能ですが、現時点ではサポートされていません) のおかげで、簡単に実行できます。

Range<DateTime> range = 19.June(1976).To(DateTime.Today);

foreach (DateTime date in range.Step(1.Days())
{
    // I was alive in this day
}

(それはまた、一連の拡張メソッドを使用しています。本番環境よりもテストに役立ちます。)

Marc の回答のも​​う 1 つの点に対処するために、Noda Timeは確かに .NET API よりも適切に日付の概念を表現できますが、現時点では範囲のようなものはありません... いいアイデアです。ただし、機能リクエストを追加しました。

于 2009-12-04T08:03:33.127 に答える
5

日付を扱う作業が多い場合は、はい - 範囲が便利です。これは、実際には(不変)として記述する必要がある非常にまれなケースの 1 つです。structただし、「野田タイム」はおそらくこれらすべてとそれ以上のものを提供することに注意してください(それが完了すると). 私は以前にソフトウェアのスケジューリングを行ったことがあります。私はそのような構造体をいくつか持っていました(わずかに異なる仕事のために)。

このための便利な BCL コンストラクトがないことに注意してください。

また、範囲がある場合に集中化できるすべての素晴らしいメソッド (および場合によっては演算子) について考えてみてください。「含む」(別の範囲の日時?制限を含む/除外する?)、「交差」、オフセット(タイムスパン)など。それを処理するタイプを持つ明確なケース。ORMレベルでは、ORMが複合値をサポートしている場合、これはより簡単であることに注意してください.NHibernateがサポートしていると思います.EF 4.0.

于 2009-12-04T07:59:50.497 に答える
1

MarkとJonがすでに述べたように、私はこれを不変の値型として作成します。私はそれを構造体として実装しIEquatableIComparableインターフェイスを実装することを選択します。

NHibernateのようなORMを使用する場合、エンティティを表すテーブル内に値型を格納できます。

于 2009-12-04T08:12:14.067 に答える
0

DateRange の性質を持つネイティブ .NET クラスについては知りません。最も近いのは、おそらく DateTime+TimeSpan または DateTime/DateTime の組み合わせです。

あなたが望むものはかなり健全だと思います。

于 2009-12-04T08:01:02.413 に答える