フローチャートと抽象化(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 で分岐しているようなやつは後ろからガッと行っておいたほうがいいんじゃないかな。

で、結局

ロジックとか手順とかまぁ、なんかそんなものを可視化して思考やロジックを整理するって話ですよね。全然抽象化ではないような。いや、モジュール化して階層化するのも抽象化には違いないんですが、オブジェクト指向はどこへ行ったというかなんというか。なんかフローチャート的な発想だとStrategyパターンを使うべき場面でひたすら switch が並んでそうじゃないですか?抽象化による拡張性の確保とかしなさそうというか。まぁ、それでいい場面も多いでしょうが。

*1:ある程度以上のプログラマならこういうイディオムは頭のなかで変換してしまうけど