Let me see if I can reformat into all the examples so we can have a real sample 
for people.  Below shows the original, what was committed.  Then shows the last 
few examples. Hopefully this won't get word wrapped to badly or have font 
issues.

The original was changed to better group the sets of conditions and added 
brackets to be able to see the "do something" separated from the conditions 
better.  My input for it would be; what you choose will be based on the current 
code and will vary with each case.  


Original:

if (prompt != null && prompt != "" && skin && skin.currentState &&
    (skin.currentState.indexOf("WithPrompt") != -1 && text.length != 0 ||
     skin.currentState.indexOf("WithPrompt") == -1 && text.length == 0))
    invalidateSkinState();


Commited:

if (prompt != null && prompt != "" && skin && skin.currentState)
{
    if (skin.currentState.indexOf("WithPrompt") != -1 && text.length != 0 ||
        skin.currentState.indexOf("WithPrompt") == -1 && text.length == 0)
    {
        invalidateSkinState();
    }
}



example 1:

if (prompt != null)
{
    if (prompt != "")
    {
        if (skin)
        {
            if (skin.currentState)
            {
                if (skin.currentState.indexOf("WithPrompt") != -1 && 
text.length != 0 ||
                    skin.currentState.indexOf("WithPrompt") == -1 && 
text.length == 0)
                {
                    invalidateSkinState();
                }
            }
        }
    }
}


example 2:
do
{
    if(prompt == null){break};
    if(prompt == ""){break};
    if(!skin){break};
    if(!skin.currentState){break};
    if(skin.currentState.indexOf("WithPrompt") == -1 && text.length != 0 ||
       skin.currentState.indexOf("WithPrompt") != -1 && text.length == 
0){break};
    
    invalidateSkinState()
    break;
} while(false);



-Mark

-----Original Message-----
From: Harbs [mailto:harbs.li...@gmail.com] 
Sent: Thursday, November 19, 2015 3:16 AM
To: dev@flex.apache.org
Subject: do-while-false

There’s a coding pattern that I like to use which I picked up from the InDesign 
SDK. When there’s some code which needs a lot of conditions to be executed, 
it’s hard to write the conditions in a way that’s easily human readable.

You can either do:
if(conditiona && conditionb && conditionc &&conditiond(
{
//do something
}

or:
if(conditiona){
  if(conditionb){
    if(conditionc){
      if(conditiond){
        // do something
      }
    }
  }
}

Both of these are kind of hard on the eyes and make fixes error-prone.

The do-while-false solution is much more ledgible than both of these and it 
goes like this:

do{
if(!conditiona){break};
if(!conditionb){break};
if(!conditionc){break};
if(!conditiond){break};
//do something
}while(false);

The reason it works is that do-while-false executes exactly once, and break 
leaves the “loop”.

The pattern reverses the logic and instead of checking when you *should* 
execute the code, it checks when you should bail out. The reason I like this 
pattern is because it makes for much flatter code and each condition stands on 
its own. That makes it easy to read and fix conditions at a later point.

How do folks feel about trying to use this pattern?

What prompted this post is commit b29975c which attempts to make a mess of 
conditions for invalidateSkinState() a bit clearer.

Thoughts?
Harbs

Reply via email to