logo

Invert your if statements!

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!