なぜか直すのが怖くなるコード
コード自体は難しくないのに、
なぜか触るのが怖い。
Pythonを書いていて、
そんな状態になったことはないでしょうか。
その原因の一つが、
状態を持たせすぎていること です。
状態とは何か
ここでいう「状態」とは、
- グローバル変数
- 関数の外で変更される値
- クラスが抱え込んでいる途中経過
といった、
処理の途中結果がどこかに残っていること を指します。
最初は便利に見える
たとえば、こんなコードです。
total = 0
def add(value):
global total
total += value
return total
使う側からすると、
とても簡単です。
ですが、
この便利さは長くは続きません。
何が問題になるのか
状態が増えてくると、
次のような問題が起きます。
- いつ値が変わったのか分からない
- 呼ぶ順番で結果が変わる
- テストがしにくい
つまり、
コードを読んでも結果を予測できない
状態になります。
状態を減らすと何が変わるか
状態を持たせない形にすると、
コードはこうなります。
def add(total, value):
return total + value
一見、手間が増えたように見えますが、
- 入力と出力がはっきりする
- 途中経過を追いやすい
- 修正の影響範囲が分かる
という変化があります。
状態は「閉じ込める」もの
状態をゼロにする必要はありません。
大切なのは、
- 状態をどこに持たせるか
- 外から見えるか、見えないか
を意識することです。
関数やクラスの中に
閉じ込める ことで、
壊れにくくなります。
作って分かったこと
このテーマを通して分かったのは、
- 状態は便利だが危険
- 見えない状態が一番怖い
- 明示的な引数は安心
ということです。
おわりに
この話は、
状態を持たせすぎたことで
修正が怖くなった経験から、
設計として
どう考えるべきかを整理した記録です。
次は、
「小さなスクリプトを育てる」
という視点から、
設計をもう一段深掘りしていきます。


コメント