問題提起
例えば、以下のようなコードを見かけたことはありませんか。僕はあります。
sample.php
if (APP_ENV === 'production') {
// 本番環境でのみ動作するコード
}
※コードはPHPですが、特定言語に依存する話ではありません。
※ドメイン(FQDN)で分岐するのも同類です。
事例としては、本番だけ特定のアドレスにメールを飛ばしたいとか。
開発環境でだけログを出したいとか。
ですが、このような実装は避けるべきと考えます。
理由は端的にいうと「テストしにくいから」
上記上げたコード、どうやってテストしたらいいでしょうか?
- 本番でテストする?
- 本番環境でテスト、とは...
- テスト環境の
APP_ENV
を一時的にproduction
にする ?- 他の箇所にも影響しますよね...
-
if (APP_ENV === 'production' or true) {
と一時的無理やり通るようにする?
どれも場当たり的な対応という印象が拭えません。
解決策
では、どうすればいいかというと
「その機能を使うか否かを判別するためのスイッチを環境変数として用意する」
例えば、環境変数で AWESOME_FUNCTION_SWITCH というのを作ります。
.env
AWESOME_FUNCTION_SWITCH=0
※ ここでは .env ファイルで定義していますが、OSの環境変数で定義してもOK
で、プログラム側では、この環境変数を見て処理を分岐します。
sample.php
if (getenv('AWESOME_FUNCTION_SWITCH') === '1') {
// AWESOME_FUNCTION の実装
}
このようにすれば、手元の環境でテストしたいときは
環境変数の値を変更すれば良いだけになり、プログラム内から環境による分岐処理を無くすことができます。