エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

わかりやすいコード・その6

コードがブログに書くには長くなりすぎてしまったのでここにアップロード
一応「わかりやすさ」というのに気をつけて書いてみたものの、書くうちに「わかりやすさ」がわからなくなってきます。

for(std::vector<Bullet>::iterator i = bullets_.begin(); i != bullets_.end(); ++i)
{
    i->draw();
}

と書くのと、

std::for_each(bullets_.begin(), bullets_.end(), std::mem_fun_ref(&Bullet::draw));

と書くのではどちらがわかりやすいか。
前者の方がC/C++の構文の形からすぐに繰り返しであることがわかるけれど、後者はそれがわかりにくいと言われるかもしれない。STLを知っていれば、後者であれば最初から最後までの繰り返し以外ありえないことがわかるから、誤解が少なくなる。

上の場合はまだしも。次のような場合にはわかりやすいのかわかりにくいのか。

bullets_.erase(remove_if(bullets_.begin(), bullets_.end(), std::not1(std::mem_fun_ref(&Bullet::isVisible))), bullets_.end());

意図を書くことが、わかりやすく書くことの指針になると思うのですが、意図を表現するにはどんな方法を使うといいのかは自明ではないのだな、というのが感想。おなじC++を使っていてもSTLの語彙を持っているか否かで表現はずいぶんと変わるわけですし。

これは、プログラミング言語自然言語と変わらないのかもしれません。