6
6

More than 5 years have passed since last update.

const 重要

Last updated at Posted at 2018-04-15

以下、私が仕事でメインで使っているのが 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コメントで ぶっきらぼうだしひょっとしたら機嫌悪いのか、とか思うかもしれませんが、本当は思いやりに飢えているだけなんです。優しくしてください。

image.png

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6