From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public X-Google-Thread: fac41,9a0ff0bffdf63657 X-Google-Attributes: gidfac41,public X-Google-Thread: 103376,4b06f8f15f01a568 X-Google-Attributes: gid103376,public X-Google-Thread: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public From: Matthew Heaney Subject: Re: Software landmines (loops) Date: 1998/08/31 Message-ID: #1/1 X-Deja-AN: 386362293 Sender: matt@mheaney.ni.net References: <902934874.2099.0.nnrp-10.c246a717@news.demon.co.uk> <6r1glm$bvh$1@nnrp1.dejanews.com> <6r9f8h$jtm$1@nnrp1.dejanews.com> <6renh8$ga7$1@nnrp1.dejanews.com> <6rf59b$2ud$1@nnrp1.dejanews.com> <6rfra4$rul$1@nnrp1.dejanews.com> <35DBDD24.D003404D@calfp.co.uk> <6sbuod$fra$1@hirame.wwa.com> <35f51e53.48044143@news.erols.com> <6sdiav$e0g$1@hirame.wwa.com> NNTP-Posting-Date: Mon, 31 Aug 1998 01:09:00 PDT Newsgroups: comp.lang.eiffel,comp.object,comp.software-eng,comp.lang.ada Date: 1998-08-31T00:00:00+00:00 List-Id: "Robert Martin" writes: > >>>For example, there's a pernicious myth that exiting (or returning) from > >>>the middle of a loop is bad, and that the only proper way to write a > >>>loop is to state the termination condition explicitly, as a predicate > >>>appearing at the top of the loop. > > > >>Yes. That pernicious myth is called "structured programming". > > > >Please cite even just a single structured programming text, or founder > >where what you say here was asserted. > > "Structured Programming", Dijkstra, Dahl, Hoare, Academic Press, 1972. p. > 16-23 "7. On Understanding Programs". You might also want to read Structured Programming: Theory and Practice, by Linger, Mills, and Witt (Addison-Wesley, 1979). (It was Harlan Mills to whom I was alluding when I referred to "doctrinaire mathematicians." I've read his work, and what can I say, it just doesn't speak to me.) I also very highly recommend The Science of Programming, by David Gries. He comes from the Dijkstra/Hoare school, and I find his advice a lot more useful. But your mileage may vary. > Actually this section says that there are two different kinds of > loops. one that is tested at the top; and another which is tested at > the bottom. But in all cases, the elements of structure programming > have a single entry and a single exit. A loop that exits in the > middle, violates this maxim. I think the issue is meaning vs syntax. When I use an exit from the middle, it's to say that "I want to terminate the loop, NOW." The problem with exit at the top is that it defers the actual termination. I have to make sure no code gets executed unintentionally between the place at which the exit flag is set, and the bottom of the loop. I can almost live that. The real problem, however, is that using an extra flag to terminate VASTLY complicates the predicate. In fact, the flag doubles the number of states I have to think about when mentally evaluating the predicate! That's the real source of the loop termination errors. (I shouldn't have to remind anyone, but just in case: George Miller did a famous study about human cognitive limits, and found that people can remember about 7 things, plus or minus 2. That's why complex predicates make a programmer's head spin, and why he often gets loop termination wrong.) Using an exit from the middle avoids the headaches (literally) engendered by using an extra flag in the predicate. When you want to exit, you just say that you want to exit, directly. No mental gymnastics are required in order to determine whether you'll "really" exit, as would be the case using the flag approach.