Friday 18 September 2009

大域変数

グローバル変数 - Wikipedia http://bit.ly/yaRZo

にも書いてあるが、

「ローバル変数は、通常その非局在性によりはっきりと悪しき慣習」

と言うわけなので、はっきり禁止だと思う。

学生の書いたコードで大域変数の除去をするのは面倒。

大域変数には、寿命の長い変数と、どこからでも見える変数の二つの意味があるが、どちらも良くない。前者は、どうしても必要な場合がある。例えば、log を取るための変数とか、統計を取るためのカウンタとか。でも、それは、どこからでも見える必要はない。

Class 変数 ( java の static )は、大域変数と同じなので、実質禁止だと思う。Singleton を作るのには必要だったりするが、例外的。static private とか書くのは、また、別な問題がある。

じゃぁ、Instance 変数は良いのかと言うと、「Object の中から、どこからでもアクセスできる」という点は、大域変数と同じ。なので、基本的に避けるべきだと思う。でも、Instance 変数は、オブジェクトの状態を構成するので避けられない。しかし、最小限にするべきだと思う。

手続きの引数に、その手続きで使われる状態を閉じ込めて持ち歩くスタイルを使う方が良い。Instance 変数は、そういうものの一つの形式だが、寿命が長すぎる。なので、寿命の短いものは、Instance 変数から分離して、メソッドの引数に渡すべきだと思う。それにより、変数の寿命とスコープを小さくできる。

private, protected, default, public みたいな世の中をわざと複雑にするpackage/scope は使うべきではないと思う。default or public で十分。private は禁止ぐらい。衝突が問題になるなら、class/package を別にするべきだと思う。

Scala は、どちらかと言えば引数持ち歩きを推奨している感じ。

自分でプログラムを書く時には、Perl だと、大域変数は使う。そんなに大きなスクリプト出ない時には。大きくなった時には、オブジェクトにするけど、Perl のオブジェクトはめんどくさいからね。

C でも、もとのプログラムが大域変数を多用していると逃げられない。残念ながら、そういうプログラムはいくつかある。

Java だと、Class 変数を見つけたら、Singleton 以外は、たぶん除去します。

No comments: