You create empty methods instead of failing
TL;DR: Don't fill in methods to comply
Problems
- Fail Fast Principle Violation
Solutions
- 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 overriden');
}
}
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
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.