Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Design pattern for application time?

If you build systems where business processes depend on what time it is[1], you cannot use DateTime.Now or similar in your code, as you will have to deal in tests with e.g., future End Of Month or End Of Year scenarios. Changing the operating system time is generally not an option when you use SSL certificates and because it is complex to do correct for a distributed system.

One option is create a singleton service accessible by all systems that returns the current time. In production it could return DateTime.Now and in tests it could return a game time like 28th of February in a End Of Month scenario.

But is there better way of doing this? Like a more database oriented approach because it leads to better performance? Or would you put in a distributed cache? Is there some well-known design pattern for this?

[1] typical example: business processes implemented by insurance system, core banking system, ...

like image 317
Lars Nielsen Avatar asked Oct 15 '13 10:10

Lars Nielsen


People also ask

What are the applications of design pattern?

Design patterns are applied to object oriented programming. There are four categories of patterns: creative – describes the process of creating objects. behavioral (also called functional) – describes the behavior and responsibilities of cooperating objects.

When should you consider applying design patterns?

Software Engineering and Design Patterns are exactly the same. They are simply common solutions to common problems. If you know the design patterns, then when you are working through a design, and particular part of a system requires something that fits a design pattern you have, then use it.


1 Answers

One way to deal with this issue is to have a clock interface:

public interface IClock {
  DateTime Now { get; }
}

And use this interface throughout your code, in place of DateTime.Now. In production, you'll use its canonical implementation (or a UTC variant):

public class SystemClock implements IClock {
  public DateTime Now { get { return DateTime.Now; } }
}

You can, e.g., use SystemClock as a default in all classes that need IClock and allow other implementations to be injected through constructors or setters.

In tests, you can create a test implementation or mock it with a mocking framework.

like image 168
Jordão Avatar answered Sep 22 '22 20:09

Jordão