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=0.7 required=5.0 tests=BAYES_00,INVALID_MSGID, PDS_OTHER_BAD_TLD 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: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public X-Google-Thread: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public X-Google-Thread: 103376,4b06f8f15f01a568 X-Google-Attributes: gid103376,public From: jtc@dimensional.com (Jim Cochrane) Subject: Re: Software landmines (loops) Date: 1998/08/31 Message-ID: <6sf4gl$hb6@flatland.dimensional.com>#1/1 X-Deja-AN: 386563995 References: <35f51e53.48044143@ Organization: Dimensional Communications NNTP-Posting-Date: Mon, 31 Aug 1998 15:27:54 MDT Newsgroups: comp.lang.eiffel,comp.object,comp.software-eng,comp.lang.ada Date: 1998-08-31T00:00:00+00:00 List-Id: How about the following version, without multiple exit points (written in Eiffel because it is a good language for this style [it actually doesn't allow the multiple return style] and because I'm familiar with Eiffel.) class STACK [G] ... is_equal (other: STACK [G]): BOOLEAN is -- Are all items in Current equal to all item in other? require other /= Void local i1, i2: STACK_ITERATOR do !!i1.make (Current); !!i2.make (other) from i1.start; i2.start until i1.after or i2.after or else i1.item /= i2.item loop i1.forth; i2.forth end Result := i1.after and i2.after end I don't think this is particularly hard to understand or maintain, plus it is simpler than the algorithm below - it eliminates the if statement at the beginning. (STACK_ITERATOR behavior is, hopefully, obvious - i.item means the value of item at the current cursor position of i.) I threw this together just for this post, so apologies if there are any bugs (and bonus points to those that find them :-) ). In article , Matthew Heaney wrote: >ahussey@it.uq.edu.au (Andrew Hussey) writes: > >> >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. >> >> That's brilliant, now your code is much easier to write! >> Now let's see who has an easier time *testing* their code. >> I think you'll find the control-flow errors you introduce >> in the spaghetti you produce will more than make up for >> any gain you have from rapid coding. > >Here's is something I whipped up for another post recently. It's an >equality operator for a bounded stack. > >The implementation of the function has multiple returns. > >Does this implementation fit your definition of spaghetti code? > >Would the implementation be better by not using multiple returns? > > >function "=" (L, R : Stack_Type) return Boolean is >begin > > if L.Top /= R.Top then > return False; > end if; > > for Index in Positive range 1 .. L.Top loop > if L.Items (Index) /= R.Items (Index) then > return False; > end if; > end loop; > > return True; > >end "="; > > >My feeling is that trying to implement this operation using only a >single return would just make it more complicated. > > -- Jim Cochrane jtc@dimensional.com