Skip to content

Latest commit

 

History

History
89 lines (51 loc) · 2.65 KB

File metadata and controls

89 lines (51 loc) · 2.65 KB

Code Smell 39 - new Date()

Code Smell 39 - new Date()

70s first tutorial: getCurrentDate(). Piece of Cake. We are in the 20s Time is global no more

TL;DR: Don't user new Date()

Problems

  • Coupling

  • Fragile Tests

  • Timezone Problems

Solutions

  1. Use Dependency injection to decouple time source.

Sample Code

Wrong

var today = new Date();

Right

var ouagadougou = new Location(); 
var today = myTimeSource.currentDateIn(ouagadougou);

function testGivenAYearHasPassedAccruedInterestsAre10() {
    var mockTime = new MockedDate(new Date(2021, 1, 1));
    var domainSystem = new TimeSystem(mockTime);
    // ..
    mockTime.moveDateTo(new Date(2022, 1, 1));
    // … You set up the yearly interest rate
    assertEquals(10, domainSystem.accruedInterests());
}

Detection

We should forbid global functions policies. We need to couple to accidental and pluggable time sources.

Tags

  • Globals

Conclusion

Date.today() , Time.now(), and other global system calls are coupling smell.

Since tests must be in full environmental control. We should easily set up time, moved it back and forth etc.

Date and Time classes should only create immutable instances. It is not their responsibility to give the actual time. This violates Single Responsibility Principle.

The passage of time is always scorned by programmers. This makes objects mutable and designs poor and coupled.

Relations

Code Smell 18 - Static Functions

Code Smell 77 - Timestamps

More Info

The Evil Power of Mutants


In programming, the hard part isn't solving problems, but deciding what problems to solve.

Paul Graham

Software Engineering Great Quotes


This article is part of the CodeSmell Series.

How to Find the Stinky Parts of your Code