… in curly bracket languages. I’ve always said – using single line ifs is dangerous, because a junior (or even a seasoned) developer might make a mistake and add an extra line of code which will not be executed in the if block.
I was watching this presentation of Kevlin Henney about Structured Programming – it talks that it’s good to use if and else if and fast returns and gotos are bad. It has a lot of examples with single line (non-curly bracket wrapped) ifs, and then this Apple’s SSL goto bug came along.
Let’s look at this simple example:
if (someBoolVar)
doSomething();
Pretty simple – doSomething() is executed only if someBoolVar is true. Now say someone want’s to add another method call if someBoolVar is true:
if (someBoolVar)
doSomething();
doSomethingElse(); // This executes whether someBoolVar is true or not
We have a logical error, that will blow up on run-time. A better solution would be to actually write a single line of if statement:
if (someBoolVar) doSomething();
At least that would prevent adding additional statements without adding scope block. But curly bracket languages have curly brackets that define scope block and my way is to always use them:
if (someBoolVar)
{
doSomething();
}
And when other developer adds it’s new method call it will actually work as expected:
if (someBoolVar)
{
doSomething();
doSomethingElse(); // Executes only if someBoolVar == true
}
So my rules of thumb are:
- Always use curly brackets in if (or any other control structure) to define subsequent statements;
- If you must use single line if statement – use just single line;
- Leave wrapped single if statements to Python, because adding another line won’t make things blow up.