フローチャートと抽象化(2)
なぜだか続くフローチャートねた。
羽生さんがフローチャートの記事のフォローエントリを書いているみたいなので反応しているわけですが。ていうか、ここのエントリを読んでくれているみたいだよね。
ループを条件式で書くという話
そもそもループは「ある条件を満たすまで繰り返す」ということですから、この時点で「分岐条件を定義する」ということが必要なのです。
それは処理を具体化しすぎだと思うのですよ。
たとえば、Perl であるリストの各項目を出力したいなら
for (@array) { print $_, "\n"; }
もしくは
print $_, "\n" for @array;
みたいなことする。有る程度以上のプログラマなら
for (my $i = 0; $i < @array; $i++) { print $array[i], "\n"; }
みたいなことをしないわけですよ。記述が冗長だからってのもあるけど、単純に上の方が意味が明確だから。
iteration が実は条件分岐で実現されているというのはその通りなのだけれども、ロジックを整理する段階でそこまで低水準のことまで考える必要はないんじゃないかな。
Java だって
for (Iterator it = list.iterator(); it.hasNext(); ) { Object obj = it.next(); doSomething(obj); }
と
for (Object obj : list) { doSomething(obj); }
だったら後者のほうが意図が明確でわかりやすい*1。
で、これは別に実装レベルの話じゃなくても同じことじゃないですかね。みんな、何かを繰り返すときにいちいち繰り返し条件とか終了条件とか考えないでしょう、普通。人に指示出すときにも「コピーの部数が10部になるまでコピーして」なんていわなよね。「10部コピーして」もしくは「10回コピーして」でいいじゃないかと。
で、ここまで書いて、iteration じゃなくて loop という表現がそもそも間違っているような気がしてきた。loop なんていうから継続条件とか終了条件という発想になるんだよ。本質的に loop である処理もあるかも知れないけど、実は iteration て表現のほうが適している処理のほうが多くないですかね。
2分岐の話
論理、集合とはいうけど、世の中には多値論理もあるよ。いや屁理屈だけど。ちなみにSQLも3値論理で、BOOLには true と false と NULL のいずれかが格納される。
でも Java 5.0 で type safe enum を使っておいて switch 使わず if で分岐しているようなやつは後ろからガッと行っておいたほうがいいんじゃないかな。