ブロックの先頭以外での変数宣言について

今日の元ネタは以下のページです(古い記事ですが)。
blog.jnito.com

まあ大筋で異論はないのですが、以前からあまり納得がいっていないのが、冒頭の
「1.使われるローカル変数をすべてメソッドの最初に宣言する。」
です。確かにC90までは、ローカル変数はブロックの先頭でしか宣言できませんでしたし、Cのスタイルを引き継いだ後発の言語、C++とかJavaとかC#とか、あるいはCでもC99からは、ブロックの途中でも変数宣言ができるようになっています。それは、その方がよい、と言語設計者が判断したからなのでしょう。しかし――
私自身、ブロック途中での変数宣言を使わないわけではありません。しかし、「使われるローカル変数をすべてメソッドの最初に宣言する」ことが悪いことであるかのように言われると、反論したくはなります。そんなことを気にする時点で、メソッドが長すぎやしないかと。
「使われるローカル変数をすべてメソッドの最初に宣言する」ことが悪いと主張する人は、変数を使う直前で宣言することで、変数のスコープを狭くすることができると言います。でも、「メソッドの先頭でちょっとだけ使う変数」は結局メソッドの最後までのスコープを持ってしまうわけで、変数のスコープを狭くする効果を期待するとしても、ずいぶん中途半端な話のように思えます。それぐらいなら、C90でも普通に使える、ブロックで囲む方法でスコープを絞る方が、なんぼか筋が通るように思います。
あと、「変数を使う直前で宣言する」というスタイルは、ブロックがスコープを制御するC起源の言語とどうも相性が悪いようにも思います。これはJavaの話になりますが、(try with resources導入前の)Javaで、try節の中で何かのリソースを生成するのでtry節の中で変数宣言して、finally節でリソースの解放処理を書こうと思ったらその変数が見えないので仕方なくtryの外に出して、さらに変数が初期化されていないとエラーが出るので仕方なく宣言時にnullを代入して、せっかくコンパイラが初期化されていないエラーを出してくれているのにこれじゃ意味ないじゃん、と悲しくなったことはないですか。
まあ、こんなことを言ってる私はレガシープログラマなのかもしれませんが、レガシープログラマならCだよね! ということで宣伝です。
今時GDIでWindows用ドローツールを作ってるC言語ポインタ完全制覇第2版発売中ですよ!

ドローツールの画面はこんな感じです。
f:id:kmaebashi:20171220010458p:plain
残念ながら紙面の都合で全ソース掲載とはいきませんでしたが、これぐらいの絵が描ける、実際に動作するドローツールを題材にしている時点で、インベーダーを題材にしながらこれじゃコードは書けないぞ、という本よりははるかにマシな本であろうと自負しております。