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: fac41,9a0ff0bffdf63657 X-Google-Attributes: gidfac41,public X-Google-Thread: 103376,4b06f8f15f01a568 X-Google-Attributes: gid103376,public X-Google-Thread: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public X-Google-Thread: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public From: "Robert Martin" Subject: Re: Software landmines (loops) Date: 1998/09/02 Message-ID: <6skgn4$3gq$1@hirame.wwa.com>#1/1 X-Deja-AN: 387281952 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@ <904556531.666222@miso.it.uq.edu.au> <6sgror$je8$3@news.indigo.ie> <6sh3qn$9p2$1@hirame.wwa.com> <6simjo$jnh$1@hirame.wwa.com> <6sjk3p$4tc$1@hirame.wwa.com> X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 Organization: WorldWide Access - Midwestern Internet Services - www.wwa.com Newsgroups: comp.lang.eiffel,comp.object,comp.software-eng,comp.lang.ada Date: 1998-09-02T00:00:00+00:00 List-Id: Matthew Heaney wrote in message ... >"Robert Martin" writes: > >> >So it's the structured approach which causes the redundancy, becuase Get >> >must be called twice. >> >> Consider: >> >> do { >> Get(N); >> if (N) >> >> } while (N); >> >> Structured programming allows the loop condition to be either at the top or >> the bottom. > >The thing I dislike about the above code fragment is that N gets tested >twice. For good reason. There are two independent program states that depend upon N. One is whether or not we call process, and the other is whether or not the loop exits. Now, we could combine them as: for(;;) { Get(N); if (N) else break; } This is certainly more efficient; and if efficiency is what you need then you'd better do this. However, the efficiency costs us something. It couples the two independent program states. This increased coupling makes it difficult to make changes that are independent of N. For example, suppose I need to flush some buffers at the end of each iteration. I do this by calling 'flush'. I must write this as: for(;;) { Get(N); if (N) flush(); } else { break; flush(); } } Whereas if I had lived with the double test: do { Get(N); if (N) { } flush(); } while (N); Robert C. Martin | Design Consulting | Training courses offered: Object Mentor | rmartin@oma.com | Object Oriented Design 14619 N Somerset Cr | Tel: (800) 338-6716 | C++ Green Oaks IL 60048 | Fax: (847) 918-1023 | http://www.oma.com "One of the great commandments of science is: 'Mistrust arguments from authority.'" -- Carl Sagan