In a recent article, Andrew Koenig argues that break
statements are harmful because they make it harder to deduce the program context at loop termination. For instance, given:
while (n != 0) { /* do something */ }
n
can be assumed to be zero at loop termination unless there is a break
within it. Koenig proposes two different approaches to alleviating this problem:- Include the program context at the
break
statement as a possible value for the program context at loop termination. - Force the loop termination condition just before
break
ing.
There is another alternative: exclude the loop termination condition from the evaluable program context. Here is a way to do that:
for (int local_n = n; local_n != 0;) { /* do something with local_n */ }
As the scope of
local_n
does not extend outside the loop, program context after loop termination does not depend on the termination procedure. A cruder, but also more flexible way to do the same is the following:{
int local_n = n;
while (local_n != 0) { /* do something with local_n */ }
}
The somewhat unexpected surrounding braces are a conspicuous reminder that local_n
does not form part of the global program state.
Por eso está bien los lenguajes que tiene foreach
ReplyDelete