Open3

グローバル変数

teasyteasy

素のグローバル変数を避けるべき理由

  • どこからでも変更できるため。
    • 結果、予想していない内容、箇所、タイミングで変更されるため。
      • 結果、バグを作ってしまう。
  • 依存関係が暗黙的に生じてしまうため。
    • 引数やインスタンス変数に指定せずとも、関数やメソッド内で気軽にアクセスできるため。
    • 自動テストのときに差し替えられない。
      • テスト時に実行したくない処理をスキップするなどができない。
  • グローバル変数にアクセスする関数の冪等性をなくすため。
    • グローバル変数のリセットできない。
      • 通常グローバルな状態保存が目的で導入するので、リセットで導入目的が達成できない。
    • 自動テストの期待値に影響するため、テストしにくい。
    • 状態変化の影響で、予期しない動作をする可能性が高まり、プロダクトコードでも使いにくい。
  • 並列アクセス時の排他制御を強制できない。

これらの問題は、多数からアクセスされるインスタンスのインスタンス変数や、static変数でも同じ。

teasyteasy

素のグローバル変数の代替案としてのシングルトン。

  • どこからでも変更できる問題。
    • 予想していない内容で変更されることは防げる。
      • メソッドを通じて変更するため、その内容を制限できるので。
    • どこからでもアクセスできることは変わらないので、予想していない箇所やタイミングで変更される。
  • 依存関係が暗黙的に生じてしまう問題。
    • この問題は解消も緩和もされない。
  • グローバル変数にアクセスする関数の冪等性をなくす問題。
    • この問題は解消も緩和もされない。
  • 並列アクセス時の排他制御を強制できない。
    • この問題は解消できる。
      • メソッドを通じてアクセスするので、そのメソッド内で排他制御をすればよい。
teasyteasy

インスタンス変数に依存しないことを明示したいがために、staticメソッドを使ったことがある。
その後別の人が機能拡張のためにstaticメソッドを変更する必要が出てきて、static変数を導入してしまった。
これによって、インスタンス間の依存が生まれてしまったことがある。
static変数のデメリットをあまり意識していない人がいる場合は、最初から通常メソッドにしておけばよかったと感じた。