2012-01-04 16 views
0

絶対時間または相対時間を計算できるクラスを作成したいと思います。
意味:コンストラクタは、期間と単位(3週間)または開始時刻と終了時刻の2つを取得します(DateTime)。私は次のコードを書いています:Cで絶対または相対時間帯クラスを作成する

public class TimePeriod 
{ 

    public State TimePerriodState { get; private set; } 
    public RelativeTime RelativeTimePeriod { get; private set; } 
    public int UnitsOfTime { get; private set; } 

    public DateTime? StartTime { get; private set; } 
    public DateTime? EndTime { get; private set; } 

    public TimePeriod(RelativeTime relativeTime, int unitsOfTime) 
    { 
     TimePerriodState = State.Absolute; 
     RelativeTimePeriod = relativeTime; 
     UnitsOfTime = unitsOfTime; 
    } 

    public TimePeriod(DateTime startTime , DateTime endTime) 
    { 
     TimePerriodState = State.Relative; 
     StartTime = startTime; 
     EndTime = endTime; 
    } 


    public enum State 
    { 
     None, 
     Absolute, 
     Relative 
    } 

    public enum RelativeTime 
    { 
     None, 
     Hours, 
     Days, 
     Weeks, 
     Months, 
     Year 
    } 
} 

しかし、その使用法は状態に基づいているのが好きではありません。 最後に、データは2つの異なるコントロールとしてUIに表示されます。 APIを少し良くするための良い方法はありますか?たぶん、データを渡して、その場でdateTimeを計算するか、それとも何かを計算しますか?

UPDATE:

使用は、そのを使用して任意の時間に相対的です。時間を入力することはできません。私はあなたが持っていると思う

答えて

1

基本的に同じデータを2回保存しようとしています。あなたがいずれかの方法で任意の期間を定義することができ

  • STARTDATEと終了日を、期間は引き算で計算することができます。
  • 開始日と継続時間(TimeSpan)、Enddateは、2つを加算して計算できます。
  • あなたは期間と終了日でそれを行うことができますが、それは物事を難しくしています。

あなたがしたいことは、それを保存する方法を選択することです。逆の場合は、それを計算する関数を記述します。例:

public TimePeriod(DateTime startTime , DateTime endTime) 
{ 
    StartTime = startTime; 
    EndTime = endTime; 
} 

public TimePeriod(DateTime startTime , TimeSpan length) 
{ 
    StartTime = startTime; 
    EndTime = startTime + length; 
} 

public TimeSpan GetDuration() 
{ 
    return EndTime - StartTime; 
} 

//Else you can just get the StartTime or EndTime variable (DateTime) 
1

(これはPOCOクラスである)TimeSpanが異なるBLクラスで計算されます

今または固定日からXからY

に先立ち10日、我々はFOは相対的な時間を持っている必要があると言うことができます用語/ドメインの理解に問題があります。期間は常に定義によって相対的です。絶対時間は固定された日付になります!

代わりにフレームワークの一部であるTimeSpan構造体を使用できますか?この時間帯がどこから計算されたのかを示すために何らかの方法で「装飾」することができます。

0

まず、UnitsOfTimeを使用することは非常に良いアイデアです。代わりにTimeSpanを使用し、UIには数週間または数ヶ月が表示されます。

public class TimePeriod 
{ 
    private readonly DateTime? _startDate; 
    private readonly DateTime? _endDate; 
    private readonly TimeSpan _timeSpan; 

    public TimePeriod(DateTime startDate, DateTime endDate) 
    { 
     if (_startDate > _endDate) 
     { 
      throw new ArgumentException(); 
     } 
     _startDate = startDate; 
     _endDate = endDate; 
     _timeSpan = endDate - startDate; 
    } 

    public TimePeriod(TimeSpan timeSpan) 
    { 
     _timeSpan = timeSpan; 
    } 

    public TimeSpan TimeSpan 
    { 
     get { return _timeSpan; } 
    } 

    public DateTime? StartDate 
    { 
     get { return _startDate; } 
    } 

    public DateTime? EndDate 
    { 
     get { return _endDate; } 
    } 

    public bool IsAbsolute 
    { 
     get { return _startDate.HasValue; } 
    } 
} 

また、このクラスが必要な理由を説明できますか?それは助けることができる。

関連する問題