Code Smell 217 - Empty Implementation

Photo by Joey Kyber on Unsplash

Code Smell 217 - Empty Implementation

You create empty methods instead of failing

TL;DR: Don't fill in methods to comply

Problems

  • Fail Fast Principle Violation

Solutions

  1. Throw an error indicating implementation is not complete

Context

Creating an empty implementation might seem fine to jump to more interesting problems.

The code left won't fail fast so debugging it will be a bigger problem

Sample Code

Wrong

class MerchantProcessor {
  processPayment(amount) {
    // no default implementation
  }
}

class MockMerchantProcessor extends MerchantProcessor {
  processPayment(amount) {
     // Empty implementation to comply with the compiler
     // Won't do anything
  }
}

Right

class MerchantProcessor {
  processPayment(amount) {
    throw new Error('Should be overridden');
  }
}

class MockMerchantProcessor extends MerchantProcessor {
  processPayment(amount) {
     throw new Error('Will be implemented when needed');
  }
}

// or better...

class MockMerchantProcessor extends MerchantProcessor {
  processPayment(amount) {
    console.log('Mock payment processed: $${amount}');
  }
}

Detection

[X] Manual

Since empty code is valid sometimes only a good peer review will find these problems.

Tags

  • Hierarchies

Conclusion

Being lazy and deferring certain decisions is acceptable, but it's crucial to be explicit about it.

Relations

More Info

Disclaimer

Code Smells are my opinion.

Credits

Photo by Joey Kyber on Unsplash


There is an art to knowing where things should be checked and making sure that the program fails fast if you make a mistake. That kind of choosing is part of the art of simplification.

Ward Cunningham


This article is part of the CodeSmell Series.