定数は再定義できない

定数は、通常再定義できません。

これは言葉通りであり、その声質を考えると当然のことです。

たとえば、円周率が特定タイミングのみ異なる値となるとしたら、世の中の様々なルールが成立しなくなりますよね。

テストで定数を再定義したいケース

ある処理のテストで、クラス定数として宣言されている値を書き換えたほうが効率が良いというケースがありました。

1class Hoge
2{
3    public const USER_FETCH_LIMIT = 300000;

あるバッチ処理で、対象ユーザ取得上限を 30 万件を超えないような制御として、 const が宣言されていました。

この const を含む処理が正しく機能しているか評価するテストを書く場合、そのままだと 30 万件超のデータを用意する、といった処理となります。

テストに関して言えば、これは果てしない無駄じゃないですか。
上限を超えないかどうか、だけ評価するのに、件数が 30 万件である必要は、全然ないんですね。

実際にやってみたところ、データを入れるのはそれなりの速度ですみますが、メモリが溢れてテストを完了できませんでした。

定数をラップする

繰り返しますが、上限を超えないかどうかだけ見るために、30 万件のデータを操作するのは果てしない無駄です。

その無駄を回避するために、通常再定義できない const をどうにかする必要があり、手っ取り早いのが 関数でラップする 、ですね。

1class Hoge
2{
3    public const USER_FETCH_LIMIT = 300000;
4
5    public function getUserFetchLimit(): int
6    {
7        return USER_FETCH_LIMIT;
8    }

これだけです。

こうしておくと、関数をモックで差し替えることができ、 30 万件を 30 件にと、数を抑えたテストにすることができます。

たったこれだけで、多くの人がハッピーになります。


レガシーなプログラムでも、横から刺す方法を知っておけば、手が出るようになります。

リファクタリング本を読んでおくと、横から刺すテクニックが身についてくるためおすすめですね。

改定されていて、改訂版はカラーになってみやすさも UP していました。