変数の値を変更することができることを可変(ミュータブル)と呼び、その反対を不変(イミュータブル)と呼ぶ。
変数がミュータブルだとこの値になるはずと意図して実装したにも関わらず、意図しないうちに値が変わってしまうという事態につながってしまう。
再代入していないか
以下のようにイミュータブルにしていないと上書きができてしまう。
x = 10
y = 20
x = y
puts x # 20
puts y # 20
不変と可変の取り扱い方針
デフォルトは不変にしているか
定数の意味が変化しなくなるので混乱を避けられる
挙動が安定し、結果を予測しやすくなる
コードの影響範囲が限定的になり保守が容易になる
可変にしてもよいとき
不変が望ましくない場合は
-
パフォーマンスに問題が生じるケース
例えば大量のデータの高速処理や画像処理リソース制約の厳しい組み込みソフトウェアなどで可変が必要なこともある。 -
スコープが局所的なケース
ループ処理のスコープでしか使われないことが確実がローカル変数ならば可変にしてもよい
まとめ
基本的に変数は不変にすること。ただし、一部例外については可変でも可能