<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"Lucida Sans";
        panose-1:2 11 6 2 3 5 4 2 2 4;}
@font-face
        {font-family:Times;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>The issue of structure is that return/break/continue can allow you to break the concept of structured code.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Your case doesn’t, but let’s use this example:<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>int foo() {<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>        if(this_condition) {<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>             if(that_condition) <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                return 0;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>            executable_code();<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>      } else {<br>          more_executable_code();<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     }<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    return 1;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>}<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>As simple as this one is, you could rewrite it to be structured but things aren’t usually that easy.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><a name="_MailEndCompose"><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></a></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> TUHS [mailto:tuhs-bounces@minnie.tuhs.org] <b>On Behalf Of </b>Don Hopkins<br><b>Sent:</b> Thursday, November 9, 2017 10:41 AM<br><b>To:</b> Noel Chiappa<br><b>Cc:</b> tuhs@minnie.tuhs.org<br><b>Subject:</b> Re: [TUHS] margins and indenting, and arbitrary c rules<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal>On 9 Nov 2017, at 16:09, Noel Chiappa <<a href="mailto:jnc@mercury.lcs.mit.edu">jnc@mercury.lcs.mit.edu</a>> wrote:<o:p></o:p></p></div><div><div><p class=MsoNormal><br>where xxx is a 'return', or a 'break', or a 'continue'. That way, you can<br>empty your brain once you hit that, and start with a clean slate.<o:p></o:p></p></div></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>Absolutely — you nailed it! Not only do guard clauses reduce indentation, but they also let you clear your mind and forget about as much as possible before running into the complex stuff you will need all of your short term memory to understand, and which is then more likely to fit on the screen. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><a href="https://stackoverflow.com/questions/268132/invert-if-statement-to-reduce-nesting/8493256#8493256">https://stackoverflow.com/questions/268132/invert-if-statement-to-reduce-nesting/8493256#8493256</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Nested if statements have more “join” points where control flow merges back together at the end instead of bailing out early, and the deeper and deeper nesting breaks up visual patterns that would otherwise be apparent and wastes lots of space (on the page and in your head). <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>“Guard clauses” with multiple returns can also make it easier to visually emphasize the symmetries and patterns in the code. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><div><p class=MsoNormal>I try to take every opportunity to break my code and expressions up across multiple lines to emphasize repetition, patterns and variations, and I always use parens to explicitly state which groupings I mean instead of depending on the reader to be a good enough programmer who has memorized all the precedence rules to infer what I mean and hope I didn’t slip up and make a mistake — I’m looking at YOU && and || !!!. (I’d fire any programmer who mixed && and || without parens just to show off what a hot-shot they were for remembering they have different precedence and trying to save a few bytes of disk space at the expense of readability.)<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>For example, instead of:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>float length = sqrt(x * x + y * y + z * z);<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>I go:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>float length =<o:p></o:p></p></div><div><p class=MsoNormal>    sqrt(<o:p></o:p></p></div><div><p class=MsoNormal>        (x * x) +<o:p></o:p></p></div><div><p class=MsoNormal>        (y * y) +<o:p></o:p></p></div><div><p class=MsoNormal>        (z * z));<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>To me, that’s like getting a “triple word score” and a “double word score" in scrabble, when I can arrange the code into pleasing patterns that explicitly shows the repetition and progression of two factors by three dimensions, and arranges the x's, y's and z's and *’s and +’s into three nice neat rows and columns reflecting the structure of the expression. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>The easier it is for your eyes to scan up and down the code to verify it’s right and detect errors, the better, and the following example shows how guard clauses can do that:<o:p></o:p></p></div></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>See how much easier it is to spot the bug:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><div><p class=MsoNormal>float length = sqrt(x * x + x * y + z * z);<o:p></o:p></p></div></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><div><p class=MsoNormal>float length =<o:p></o:p></p></div><div><p class=MsoNormal>    sqrt(<o:p></o:p></p></div><div><p class=MsoNormal>        (x * x) +<o:p></o:p></p></div><div><p class=MsoNormal>        (x * y) +<o:p></o:p></p></div><div><p class=MsoNormal>        (z * z));<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div></div><div><p class=MsoNormal><a href="http://wiki.c2.com/?GuardClause">http://wiki.c2.com/?GuardClause</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Times","serif"'>Here is a sample of code using guard clauses ...</span><o:p></o:p></p><pre>  public Foo merge (Foo a, Foo b) {<o:p></o:p></pre><pre>    if (a == null) return b;<o:p></o:p></pre><pre>    if (b == null) return a;<o:p></o:p></pre><pre>    // complicated merge code goes here.<o:p></o:p></pre><pre>  }<o:p></o:p></pre><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Times","serif"'>Some style guides would have us write this with a single return as follows ...</span><o:p></o:p></p><pre>  public Foo merge (Foo a, Foo b) {<o:p></o:p></pre><pre>    Foo result;<o:p></o:p></pre><pre>    if (a != null) {<o:p></o:p></pre><pre>      if (b != null) {<o:p></o:p></pre><pre>        // complicated merge code goes here.<o:p></o:p></pre><pre>      } else {<o:p></o:p></pre><pre>        result = a;<o:p></o:p></pre><pre>      }<o:p></o:p></pre><pre>    } else {<o:p></o:p></pre><pre>      result = b;<o:p></o:p></pre><pre>    }<o:p></o:p></pre><pre>    return result;<o:p></o:p></pre><pre>  }<o:p></o:p></pre><div><pre><o:p> </o:p></pre></div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Times","serif"'>This second form has the advantage that the usual case, the merge, is dealt with first. It also has a single exit as the last line of the routine which can be handy with some refactorings. It has the disadvantage of separating the exceptional conditions from their corresponding results which, in this case, makes it harder to see the symmetry of the conditions. It also buries the usual, and complicated, case inside a couple of layers of braces, which may make it harder to read.</span><o:p></o:p></p><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Times","serif"'><o:p> </o:p></span></p></div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Times","serif"'>The guards are similar to assertions in that both protect the subsequent code from special cases. Guards differ from assertions in that they make a tangible contribution to the logic of the method and thus cannot be safely omitted as part of an optimization. I borrowed the term <em><span style='font-family:"Times","serif"'>guard</span></em> from </span><a href="http://wiki.c2.com/?EwDijkstra"><span style='font-size:13.5pt;font-family:"Times","serif";text-decoration:none'>EwDijkstra</span></a><span style='font-size:13.5pt;font-family:"Times","serif"'> when naming this pattern. The first form above hints at the elegance of his <em><span style='font-family:"Times","serif"'>guarded commands</span></em> though Dijkstra manages to save the single exit property in his code as well. -- </span><a href="http://wiki.c2.com/?WardCunningham"><span style='font-size:13.5pt;font-family:"Times","serif";text-decoration:none'>WardCunningham</span></a><o:p></o:p></p><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Times","serif"'><o:p> </o:p></span></p></div><div><div><p class=MsoNormal><span style='font-family:"Lucida Sans","sans-serif"'><o:p> </o:p></span></p></div></div></div></div></body></html>