Sở thích của tôi là có các lớp sử dụng thời gian thực sự dựa trên một giao diện, chẳng hạn như
interface IClock
{
DateTime Now { get; }
}
Với một triển khai cụ thể
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Sau đó, nếu muốn, bạn có thể cung cấp bất kỳ loại đồng hồ nào khác mà bạn muốn để thử nghiệm, chẳng hạn như
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Có thể có một số chi phí trong việc cung cấp đồng hồ cho lớp dựa vào nó, nhưng điều đó có thể được xử lý bằng bất kỳ giải pháp chèn phụ thuộc nào (sử dụng Inversion of Control container, phương thức khởi tạo / bộ định tuyến cũ đơn giản hoặc thậm chí là một Mẫu cổng tĩnh ).
Các cơ chế khác của việc cung cấp một đối tượng hoặc phương thức cung cấp thời gian mong muốn cũng hoạt động, nhưng tôi nghĩ điều quan trọng là tránh đặt lại đồng hồ hệ thống, vì điều đó sẽ chỉ giới thiệu nỗi đau ở các cấp độ khác.
Ngoài ra, việc sử dụng DateTime.Now
và đưa nó vào các tính toán của bạn không chỉ là không ổn - nó còn cướp đi của bạn khả năng kiểm tra các thời điểm cụ thể, chẳng hạn như nếu bạn phát hiện ra một lỗi chỉ xảy ra gần ranh giới nửa đêm hoặc vào các ngày Thứ Ba. Sử dụng thời gian hiện tại sẽ không cho phép bạn kiểm tra các tình huống đó. Hoặc ít nhất là không phải bất cứ khi nào bạn muốn.