グローバル変数やめようぜ
なぜなら
- どこで誰が参照してるかわからない
- 誰が書き換えてるかわからない
引数
- 関数またがって変数を共有したいなら引数で渡すのが基本だぜ。
- でも「どの関数にも必ず渡す変数」があったなら、それはグローバル変数と変わんないぜ。
- 引数が増え過ぎたら、「触るべき変数」の単位でモジュール分割できてない証拠だぜ。
インスタンス変数
- どうしても関数をまたいで共有したい変数があったらインスタンス変数にしようぜ。
- ただ、クラスが巨大になると、インスタンス変数はグローバル変数とおなじだぜ。
- クラスは小さくしようぜ。
定数
- スコープはグローバルだけど「変えない」ことが確定させるなら定数という手があるぜ。
- ただその定数が本当にグローバルで見えるべきかどうかは考えた方がいいぜ。
- クラスの初期化のためだけに必要な定数ならクラスの初期化メソッド中でのハードコーディングでいいぜ。
ファイルアクセス
- ファイルにアクセスする箇所は絞ろうぜ。
- あちこちで同じファイルに読み書きしちゃったそれはグローバル変数と変わんないぜ。
環境変数
- 環境変数にアクセスできるクラスは絞ろうぜ。
- なんなら環境変数ってグローバルだから書き換えさえできちゃうけど、それはやめようぜ。 (ほとんどの人は変わらない前提でロジック書いちゃうから)
データベース
- データベースにアクセスできるクラスは絞ろうぜ。
- データべースの読み書きはだいたいどこからでもできちゃうシステムが多いけど、あえて絞ろうぜ。
デバッグ/ログ
- デバッグやログ関するオブジェクトだけは例外だぜ
- どっからでもログには書き出せないと不便だぜ
- だからこそログは基本は書き込みのみのデータフローだぜ
- 当然ログは更新なんてしないぜ
副作用は排除ではなく局所化だぜ
- プログラミング言語のレイヤーでは副作用の少ないロジックは作れるけど、ファイルやデータベースは副作用の塊だぜ
- 副作用は追い出すのではなく局所化することが大事だぜ。