質問

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

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の1を認識していないよ。

私の経験では、より深く、多くの場合、オブジェクト階層を作成するには、物事を複雑にします。これらのオブジェクトは、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タイプで私のパブリックドメインのメソッドのシグネチャを汚染することは非常に、非常に汚い感じます。

役に立ちましたか?

解決

いいえ、あなたは、汎用クラスを逃さなかった。

確かにそれ -

私はあなたに興味がある可能性があり MiscUtil の中Rangeタイプを持っていますシンプルDateTime操作になります。マルクの答えを参照すると、私はこれは構造体やクラスであるかどうか覚えていないことができます - あなたはもちろん、それを変更することが歓迎されると思います。

これは、ステップ実行するためにいいと簡単ですによるマークのジェネリックにペテン(あなたは.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
}

(つまりも拡張メソッドの束を使用してい - 。製造より試験にとってより有用)

マルクの答えの他の点に対処するために、野田時間には確かにできるようになります//:私は<のhref = "のhttpを追加しました - より適切.NETのAPIよりも日付の概念を表現するが、我々は現時点ではレンジのようなものを持っていない...それはしかし、素敵なアイデアをうcode.google.com/p/noda-time/issues/detail?id=2" のrel = "noreferrer">機能要求するます。

他のヒント

.NET 4.0以上のTuple <>型で複数の値を処理するために添加した。

タプル型を使用すると、その場での値の独自の組み合わせを定義することができます。あなたの問題は非常に一般的であり、関数は複数の値を返すように望んでいるときに似ています。以前は、変数を使用するか、単に機能の応答のための新しいクラスを作成する必要がありました。

Tuple<DateTime, DateTime> dateRange =
    new Tuple<DateTime, DateTime>(DateTime.Today, DateTime.Now);

あなたが取るどのルート、私は、あなたは間違いなく正しいアプローチを取っていると思います。次の2つの日付が一緒にペアになっているところに本当の意味を与えています。それは正しいコードの構造で、自己文書化コードとの最大の方法であります。

あなたが日付で多くの作業を行う場合は、

、はい - 範囲が便利です。これは実際には、を、それらのOH-SO-まれなケースの一つであるの、おそらく(不変)structとしてそれを書く必要があります。 (それが完了したときに)「野田時間」は、おそらくあなたの本以上のすべてを与えること、しかし、注意してください。私は前にソフトウェアをスケジュールやりました。私は(わずかに異なるジョブの場合)、このような構造体のカップルを持っていました。

注、このための便利なBCLコンストラクトはありません。

また、 - あなたが範囲を持っているときに集中させることができ、すべての素晴らしい方法(そしておそらくオペレーター)を考えます。それを処理するためのタイプを有するための明確のケースA、(?制限を除く/含む?別の範囲?日時の)「含有」「交差」、オフセットによって(タイムスパン)を、等。あなたのORMは、複合値をサポートしている場合、ORMのレベルでは、これが簡単であることに注意してください - 。私はNHibernateのはないと信じて、そしておそらくEF 4.0

私はのDateRangeの自然の任意のネイティブ.NETクラスを知りません。最寄りのは、おそらくのDateTime +のTimeSpanまたは日時/日付と時刻の組み合わせです。

私が何をしたいことは、かなりの音だと思います。

マークとジョンが既にmentionnedとして、私は不変である値型、としてこれを作成します。私は、構造体としてそれを実装することを選ぶと、IEquatableとIComparableをインターフェイスを実装します。

NHibernateのようなORMを使用する場合は、

は、エンティティを表すテーブル内の値のタイプを格納することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top