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: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public X-Google-Thread: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public From: "Robert Martin" Subject: Re: Software landmines (loops) Date: 1998/08/31 Message-ID: <6sfq27$fuo$1@hirame.wwa.com>#1/1 X-Deja-AN: 386697030 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> <35EAB5B1.1DA1986B@ehpt.com><6sf1dn$n52$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-08-31T00:00:00+00:00 List-Id: Robert I. Eachus wrote in message ... > > Finalization did end up in Ada 95, and it is the right solution to >this particular problem. I am not sure of the semantics of 'finalization' in ADA9X, but if it works like Java's, then it does not solve the problem created by multiple exits from loops. Again, the issue is structure. When a single-entry/single-exit model is followed, the code attains a structure that is conducive to resource management. Consider: (C++ with a finally clause (which I wish it had!)) int f() { char* p = 0; File* f = 0; try{ p = malloc(80); if (!p) return 1; f = fopen("myFile", "r"); if (!f) return 2; fread(f, p, 80); ... return 0; } finally{ if (f) fclose(f); if (p) free(p); } } The problem with this is the tests in the finally clause. Those tests are an artifact due to loss of structure. They take time, space, and are not general (i.e. there might be no reasonable test to perform!) On the other hand: int f() { int retval = 0; if (char* p = malloc(80)) { if (File* f = fopen("myFile", "r"); { fread(f, p, 80); ... fclose(f); } else // fopen failure { retval = 2; } free(p); } else // malloc failure { retval = 1; } return retval; } No tests necessary, structure preserved. 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