Code Smell 201 - Nested Ternaries
TL;DR: Don't use nested IFs or nested ternaries
Problems
Readability
Default Case
Solutions
- Rewrite the code as an IF condition with an early return
Context
Nesting is always a problem with complexity.
We can fix it with polymorphism or early returns
Sample Code
Wrong
const getUnits = secs => (
secs <= 60 ? 'seconds' :
secs <= 3600 ? 'minutes' :
secs <= 86400 ? 'hours' :
secs <= 2592000 ? 'days' :
secs <= 31536000 ? 'months' :
'years'
)
Right
const getUnits = secs => {
if (secs <= 60) return 'seconds';
if (secs <= 3_600) return 'minutes';
if (secs <= 86_400) return 'hours';
if (secs <= 2_592_000) return 'days';
if (secs <= 31_536_000) return 'months';
return 'years'
}
// More declarative
const getUnits = secs => {
if (secs <= 60) return 'seconds';
if (secs <= 60 * 60) return 'minutes';
if (secs <= 24 * 60 * 60) return 'hours';
if (secs <= 30 * 24 * 60 * 60) return 'days';
if (secs <= 12 * 30 * 24 * 60 * 60) return 'months';
return 'years'
}
Detection
[X] Automatic
Linters can detect this complexity using parsing trees.
Tags
- IFs
Conclusion
We must deal with accidental complexity to improve code readability.
Relations
Disclaimer
Code Smells are my opinion.
Credits
One of the best things to come out of the home computer revolution could be the general and widespread understanding of how severely limited logic really is.
Frank Herbert
This article is part of the CodeSmell Series.
Subscribe to my newsletter
Read articles from Maxi Contieri directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Maxi Contieri
Maxi Contieri
I’m a senior software engineer loving clean code, and declarative designs. S.O.L.I.D. and agile methodologies fan.