以下、私が仕事でメインで使っているのが C++ なので、その観点です。ruby などではまた違った考えが必要だと思います。
const おじさん現る
私の PRレビューで 非常によく見かける指摘の1つに「これ const
にできますね」というのがあります。
一昔前 staticおじさん というのがある種の人々を揶揄する語として流行ったことがありますけど、 それに倣うなら const
おじさんと呼ばれそうなくらいに。
(なお、C++11 からは constexpr
もあるので、場合によっては constexpr
おじさんにもなります)
精神的負担について
ただ、これにはわけがあって、C/C++ において const
と書いた場合、それは設計意図の表明であり(同時にコンパイラに対する制約とヒントともなる) 、レビューという活動が設計に対するフィードバックをその第一義としているのであれば当然すべきフィードバックだから、です。
もっと噛み砕いて言うと、 const があるのと無いのとでは そのコードを理解しようとする人(レビュワーだけとは限らない)にとって 精神的負担が 2倍、、、いや 10倍くらい違うから です。
脳内スタック消費理論
変数なり、構造体のフィールドなりが出てきた時に、const
が付いていたら「この値は初期化されて以降 金輪際変化しない」ことが強く確信できるのですが、そうじゃない場合「この値はこの先のどこかで変更されるかもしれない」という可能性を常に頭の中に置きながら読み進める必要があります。
つまり「読み下すために覚えておかなければいけないこと」が増え、脳内スタックを消費します。そのような変数が複数あった場合、(特に私のように脳内スタック容量が小さい人にとっては)とてもとてもとっっっても負担です。
そして割れ窓理論へ
「でもでもすごく局所的だし、変数の寿命も限られたスコープ内だからいいよね!?」と思うかもしれませんが、これはいわゆる 割れ窓理論 ってやつで、そういうものも看過できません。
Google C++ Style Guide では...
Google C++ Style Guide でも、そうできるところでは極力 const を使いなさい、ということが書かれています。ここには Pros/Cons も書かれていますので参考まで。
Use of const
Use const whenever it makes sense. With C++11, constexpr is a better choice for some uses of const.
他の言語でも
参考まで、と言えば、変数といえば immutable (つまり const)なものがデフォルトで、 mutable にしたい場合は敢えてそう書かないとイケないようになっている言語もあります。
たとえば、 Objective-C だと 文字列型 NSString
配列型 NSArray
辞書型 NSDictionary
などはすべて immutable で、値のセットは初期化時にのみ行なえます。途中で値が変更される可能性がある場合はそれぞれ NSMutableString
NSMutableArray
NSMutableDictionary
と mutable であることが明示された型を使う必要があるわけです。
( これらはクラスなので厳密には Objective-C の言語機能そのものとは関係ありませんが、 Objective-C はその成立過程の背景から、クラスライブラリおよびランタイム実装含めてその言語の世界の構成物=設計思想を実体化しているもの の一つである、というスタンスで書いています)
結論: 思いやりの心
、、、とここまでつらつらと 「私はいかにして const
おじさんになったのか」を語ってきました。
レビューに出すあなたはひょっとしたら脳内スタック容量が大きいのかもしれませんが、そうじゃない人もいるんだ、と 思いやりの心 でぜひとも const
には気をつけてください。いや、お願いだから。
ただヒトコト、 const auto
とだけのPRコメントで ぶっきらぼうだしひょっとしたら機嫌悪いのか、とか思うかもしれませんが、本当は思いやりに飢えているだけなんです。優しくしてください。