To be clear, I think Mark’s code was a nice compromise between approach #1 and approach #2.
In this case following Flex code formatting style, do-while-false should look something like this: do { if(prompt == null) break; if(prompt == "") break; if(!skin) break; if(!skin.currentState) break; if(skin.currentState.indexOf("WithPrompt") == -1 && text.length != 0) break; if(skin.currentState.indexOf("WithPrompt") != -1 && text.length == 0) break; invalidateSkinState(); } while(false); An additional advantage here is that you can break up the OR statement into two separate conditions. I’m also not proposing using this pattern all the time. Sure. For a few simple conditions if(a && b) is the simplest way to go. There are times when nested ifs make sense as well. If there’s a set of conditions which are used in a number of places, a function call like Justin mentions make the most sense there. On Nov 19, 2015, at 3:19 PM, Maxim Solodovnik <solomax...@gmail.com> wrote: > I believe example2 need to be reformatted to match example1 > 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); > > and most probably second if need to divided into 2 ifs :) > > On Thu, Nov 19, 2015 at 6:51 PM, Kessler CTR Mark J < > mark.kessler....@usmc.mil> wrote: > >> 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 >> > > > > -- > WBR > Maxim aka solomax