Switch
Georg Wrede
georg.wrede at iki.fi
Mon May 18 19:31:37 PDT 2009
bearophile wrote:
>
> void classify(char c) {
> write("You passed ");
> switch (c) {
> case '#':
> writeln("a hash sign.");
> break;
> case '0' ..> '9':
> writeln("a digit.");
> break;
> case 'A' ..> 'Z', 'a' ..> 'z':
> writeln("an ASCII character.");
> break;
> case '.', ',', ':', ';', '!', '?':
> writeln("a punctuation mark.");
> break;
> default:
> writeln("quite a character!");
> break;
> }
> }
(A bunch of other versions omitted.)...
void classify(char c) {
write("You passed ");
switch (c) {
case '#':
writeln("a hash sign.");
break;
case '0' .. case '9':
writeln("a digit.");
break;
case 'A' .. case 'Z':
case 'a' .. case 'z':
writeln("an ASCII character.");
break;
case '.', ',', ':', ';', '!', '?':
writeln("a punctuation mark.");
break;
default:
writeln("quite a character!");
break;
}
}
This is usable, easy to read -- and the programmer has no problem to
remember that .. works differently in case statements than in ranges.
There are other places in D that place an undue burden on the
programmer, but this is not IMHO one of them.
--------------------
My pet peeve with case is that, since we don't seem to be getting rid of
break (and use some word for fall-through instead, "which would save a
good deal of ink"), we should at least try to make break more
conspicuous. I can name a hundred times I've forgotten a break from
somewhere. So the canonical indentation should be like this:
void classify(char c) {
write("You passed ");
switch (c) {
case '#':
writeln("a hash sign.");
break;
case '0' .. case '9':
writeln("a digit.");
break;
case 'A' .. case 'Z':
case 'a' .. case 'z':
writeln("an ASCII character.");
break;
case '.', ',', ':', ';', '!', '?':
writeln("a punctuation mark.");
break;
default:
writeln("quite a character!");
break;
}
}
(It'd look better when the cases have more lines, but still.) Currently
in D, break is at least as important as case, therefore it deserves a
conspicuous place, hence my suggestion.
More information about the Digitalmars-d
mailing list