Invert your ifs!

codevault

Sergiu Mureşan

Posted on August 31, 2018

Invert your ifs!

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');
}
Enter fullscreen mode Exit fullscreen mode

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.');

Enter fullscreen mode Exit fullscreen mode

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!

💖 💪 🙅 🚩
codevault
Sergiu Mureşan

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