Invert your ifs!
Sergiu Mureşan
Posted on August 31, 2018
You've all seen the literal side mountain of code, here's a refresh:
if (candies.length > 0) {
if (store.isOpen()) {
if (store.allCandyIsLow()) {
for (let candy of candies) {
store.refill(candy);
}
notification('Store ' + store.Name + ' had its candies refilled.');
} else {
console.error('There is still candy in the store');
}
} else {
console.error('No stores to put the candy into');
}
} else {
console.error('No candies');
}
This becomes really difficult to manage because
- code block's main purpose is nested inside all if statements while
- the exceptional/error cases are right in your face and
- their condition and error are as far away from each other as possible
This hurts the code's readability, flexibility and maintainability (adding or changing the condition's order becomes tough).
Here's a practical solution that can be applied at any moment in development you want with doing these simple steps until there are no longer any exception cases nesting the main code:
- take the code out of the if statement
- invert the condition
- bring the code inside else in the if block
- add a return statement (or whatever comes after the large block)
The code from above should now look something like this:
if (candies.length <= 0) { // or === 0 in this case
console.error('No candies');
return;
}
if (!store.isOpen()) {
console.error('No stores to put the candy into');
return;
}
if (!store.allCandyIsLow()) {
console.error('There is still candy in the store');
return;
}
for (let candy of candies) {
store.refill(candy);
}
notification('Store ' + store.Name + ' had its candies refilled.');
Albeit, the code block itself became larger but
- there are no longer any nested if statements
- the main code comes right after all the exception cases
- you can see what each exception case does and add/modify as needed
What do you think? Are there any better solutions? Does this one have some critical flaws we missed? Ask away!
Posted on August 31, 2018
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
September 11, 2018