Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Klasse für Zeitraum erstellen

  Alt 5. Jan 2012, 15:07
Da würde ich spontan kleinere Schönheitskorrekturen machen erstmal.
Code:
    public enum RangeKind(Days, Weeks, Months, Years);
    public class Period : IPeriod
    {
        private RangeKind Kind;
        private int Start;
        private int Length;
        private string Name;
       
        public Period(RangeKind kind, int start, int length, string name)
        {
            Kind = kind;
            Start = start;
            Length = length;
            Name = name;
        }
       
        public DateTime StartTime{
                get{
                    DateTime date = DateTime.Today;
                    switch(kind){
                        case Days:
                            date = date.AddDays(start);
                            break;
                        case Weeks:
                            date = date.AddDays(-(int)date.DayOfWeek + 7*start);
                            break;
                        case Months:
                            date = date.AddDays(-date.Day+1).AddMonths(start);
                            break;
                        case Years:
                            date = date.AddDays(-date.DayOfYear+1).AddYears(start);
                            break;
                    }
                    return date;
                }
        }
       
        public DateTime EndTime{
                get{
                    DateTime date = DateTime.Today;
                    switch(kind){
                        case Days:
                            date = date.AddDays(start+length).AddSeconds(-1);
                            break;
                        case Weeks:
                            date = date.AddDays(-(int)date.DayOfWeek + 7*start + 7*length).AddSeconds(-1);
                            break;
                        case Months:
                            date = date.AddDays(-date.Day+1).AddMonths(start+length).AddSeconds(-1);
                            break;
                        case Years:
                            date = date.AddDays(-date.DayOfYear+1).AddYears(start+length).AddSeconds(-1);
                            break;
                    }
                    return date;
                }
        }
       
        public string Name{get{return name;}}
    }
Das aber eher, um "Gepflogenheiten" in C# gerecht zu werden. Aber wenn du schon einen GC und einen Enum hast, würde ich fast auf meinen 3. Vorschlag inkl. der Factory gehen. Ich würde als Zeitparameter (Start) zudem auch eher einen DateTime übergeben, und in der Klasse dann errechnen welcher Wert dem Anfang im gewünschten RangeKind entspricht. Dann ließe sich das ganze immer schön schlank mit "Now" aufrufen lassen.
Man könnte zudem den Enum statt als Feld auch als Index-Parameter für die Properties nehmen, so dass man nachher aufrufen würde "DateTime myStartTime = new Period(Now, "foo").StartTime[Weeks];".
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat