Ich bevorzuge Klassen, die Zeit verwenden und tatsächlich auf einer Schnittstelle basieren, wie z
interface IClock
{
DateTime Now { get; }
}
Mit einer konkreten Umsetzung
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Wenn Sie möchten, können Sie jede andere Art von Uhr zum Testen bereitstellen, z
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Die Bereitstellung der Uhr für die darauf basierende Klasse kann mit einem gewissen Aufwand verbunden sein, der jedoch von einer beliebigen Anzahl von Abhängigkeitsinjektionslösungen (unter Verwendung eines Inversion of Control-Containers, einer einfachen alten Konstruktor- / Setter-Injektion oder sogar eines statischen Gateway-Musters) verarbeitet werden kann ).
Andere Mechanismen zur Bereitstellung eines Objekts oder einer Methode, die die gewünschten Zeiten liefern, funktionieren ebenfalls, aber ich denke, das Wichtigste ist, ein Zurücksetzen der Systemuhr zu vermeiden, da dies nur auf anderen Ebenen zu Schmerzen führen wird.
Die Verwendung DateTime.Now
und Einbeziehung in Ihre Berechnungen fühlt sich nicht nur nicht richtig an, sondern raubt Ihnen auch die Möglichkeit, bestimmte Zeiten zu testen, z. B. wenn Sie einen Fehler entdecken, der nur in der Nähe einer Mitternachtsgrenze oder dienstags auftritt. Wenn Sie die aktuelle Zeit verwenden, können Sie diese Szenarien nicht testen. Oder zumindest nicht wann immer Sie wollen.