仕事の話。既存システムから使用されているDB関係の関数処理を追っかけてたらかなりこんがらがった。見覚えのない変数を参照してるなーと思って素性を調べてみるとグローバル変数だったとか。しかもこの変数全然関係ない別の関数で値をセットしたりされてるし。これをちゃんと追っかけるのはしんどいなあ。仕様書には事前に呼び出しておかないといけない関数が示されているのだけど、本当にこれだけで大丈夫なのかなあ。まあ確かにそのようになってたところがあったような気がするけど。ファイルローカル変数は結構ばしばし使ってもそんなに気にならない(ただしヘッダファイルに書くのは除く←できるかどうか知らないけど)が、複数の場所で読み書きするグローバル変数はちゃんと管理(仕様書に書くとか)しないと駄目だなあ。ちょっとプログラムサイズが大きくなるとてきめんに把握しにくくなる。いやまあコメントがついてないのも大きいと思うんだけど。
と、ふと思うのだけど、変数のスコープというのはそれほど問題ではなく、本質的には変数が有効である行数こそが問題なんじゃないのか。変数が有効な行数はスコープである程度規定されるので、そう言う意味ではスコープに気を配るのも間違いじゃないと思うんだけど。つまり、1関数300行が5つあるファイルでファイルローカル変数を使うのと、1関数2000行での関数ローカル変数(自動変数)を使うのとでは前者の方が見通しがいいんじゃないかと言う話。見通しがどうとかじゃなくて、この場合はどっちがマシかという話だと思うけど。