Jan Dittmer wrote:
Andrey Hristov wrote:
Robert Cummings wrote:
Unmaintainable because of the ability to write cryptic code. There's
nothing cryptic about:
...code
goto cleanup:
...code
cleanup:
do {
.....code...
if (something) break;
...code....
} while (0);
...cleanup code...
This works for one level, but imagine:
... code ... (which exits with goto_out)
if (!alloc x)
goto out;
... code ... (which exits with goto_outfreex)
if (!alloc y)
goto out_freex;
... code ... (which exits with goto_outfreey)
if (!alloc z)
goto out_freey;
... code ...
free z;
out_freey:
free y;
out_freex:
free x;
out:
print bye;
For this you'll need 3 nested do{}while(); loops and your indention is
so far to the right, that you can barely write more than two more words
on a line.
This really looks a lot cleaner with goto.
I just woke up but I think this can be solved with one do..while and using
bitfield for example. so when you break, just check the bitfield what to
clean up.
$clean = 0;
do {
$res = some_op();
if (!$res && $clean|=CLEAN_TYPE1) break;
$res = some_op2();
if (!$res && $clean|=CLEAN_TYPE1) break;
$res = some_op3();
if (!$res && $clean|=CLEAN_TYPE2) break;
} while (0);
if ($res & CLEAN_TYPE1) {
//do clean type 1
}
if ($clean & CLEAN_TYPE2) {
// do clean type 2
}
But I see that in your case simple variable and then having switch() after
the do..while will be enough, just fall-through will be used.
regards,
andrey
p.s.
thanks for the nice example :) good exercise for the brain early in the morning :)
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php