2006/12/10
idiom ? coding pattern ?
例えば、0~59の数列を扱うのに
int second = 0;
for (;;) {
/* secondを使う */
second++;
if (second > 59) {
second = 0;
}
}
みたいなコードを見ることがある。
こういうのは、
int count = 0;
for (;;) {
/* secondを使う */
second = (second + 1) % (59 + 1);
}
と書くべきである、というのはidiomと呼ぶのか、coding patternとでも呼ぶのか?
昔読んだ本(GoF本だったかな)では、idiomは言語依存のパターンで、その上の層にはdesign patternとなっていた。
このような、言語に依存するわけではないけどdesign patternと呼ぶには大げさすぎるものは、なんと呼ぶのだろう。
ちなみに、1~12の数列であれば
month = (((month - 1) + 1) % 12) + 1;
と書ける。一度0~11にしてから剰余を求め、その後にオフセットを足してやればいい。
もうちょっと一般化すると、n~mの整数列(step刻み)は
count = (((count - n) + step) % (m - n + 1)) + n;
で得られる。nが負の値でも一緒。
stepが負の場合は、(step + (m - n + 1) * r)が正になるようなrを選んでstepとする。
stepを-1にしたmonthの例だと、stepは-1 + 12 * 1になり
month = (((month - 1) + 11) % 12) + 1;
で12, 11, 10, … , 2, 1, 12, … という数列が得られる。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/anaka/idiom-coding-pattern/tbping