変更に強く、高品質なソースコードの書き方のテクニックとしてイミュータブルな実装についてご紹介します。
近年、システムやプログラムはアップデートして新機能の追加や改善を繰り返してサービスを継続するものが多くなってきています。
問題を起こさずにサービスを運営していくには、システムを構築しているプログラムの質が大切です。
つまり、高品質なソースコードと、高品質なソースコードを書ける技術者が求められています。
特に重宝されているのが、「変更に強いソースコード」です。
変更に強いソースコードというのは、後からプログラムに新機能の追加や改良を加える際のコストが低く、機能の追加によってバグが発生しにくい構造のソースコードです。

変更に強いソースコードを書くテクニックは様々な物がありますが、今回はその中でもイミュータブルな実装についてご紹介していきます。
特に、初心者の人が覚えておくと、後々苦労が減ると思いますのでよりオススメです。
Java言語を前提に話しを進めていきますが、イミュータブルは思想の話なのでどのプログラミング言語に置き換えて貰っても問題無いかと思います。
イミュータブルとは?
「イミュータブル(Immutable)」を直訳すると「不変」という意味になります。
その意味の通り、作成したオブジェクトの状態を後から変更出来ないように実装する事をイミュータブルな実装と呼びます。
つまり、一度作成したオブジェクトや変数に値を再代入しないで実装を行うという事です。
当然、「本当に再代入を行わないでプログラミングが出来るのか?」という疑問もあると思います。
ですが、例えばWebシステムに当てはめて考えると、基本的にはリクエストに対して必要な処理を行ってレスポンスを返すという一方通行な実装をする場合は再代入を必要とする場合はほとんどありません。
そして、この一方通行な思想が変更に強いソースコードには必要な考え方になります。
つまり、処理が様々な関数を循環するような実装は不適切で、イミュータブルな実装を行う事で自然と一方通行な実装になり、ソースコードの品質が高くなります。
もしも、再代入をたくさん使っているという実装をしているならば、そのプログラムの設計や実装方法を見直したほうが良いです。
イミュータブルのメリット
では、具体的にイミュータブルな実装におけるメリットについてご紹介します。
- イミュータブルな実装を守る事で、自然とソースコードの質が上がる
- オブジェクトや変数が後から変更されない事が保証されていると、ソースコードを解読する時間が短縮出来る
- バグを減らす事が出来る
①は、イミュータブルな実装を行う事である程度プログラミングのルールが定まります。
例えば、変数の再代入を禁止する事によって、再代入をしない実装を実現する必要があるので、場合によっては実装方法の見直しや工夫をする必要が出てきます。
そうする事で、結果的にルールに定まったプログラミングが出来るので、ソースコードの質が上がります。
②は、予めオブジェクトや変数が変更されないという前提があることで、読む必要の無いソースコードを省略する事が出来ます。
例えば、メソッド呼び出しの引数に配列を渡す実装があると、その呼び出したメソッドの中身を確認しないと引数で渡した配列の値が変わっているかどうかがわかりません。
しかし、後から変更されない事が保証されていると、メソッドの中身を確認しなくても変数に変更が無い事がわかります。
③は、オブジェクトや変数の中身がどこかで勝手に変わってしまう事が影響して発生するバグが起きないようになります。
このように、イミュータブルな実装はソースコードの質を上げるのに不可欠な要素なのです。
イミュータブルな実装方法
では、実際にイミュータブルな実装方法についてご紹介します。
気を付ける事は多くはありませんが、イミュータブルな実装になるように工夫を凝らすのは場合によってはコツが必要になるかもしれません。
変数にfinalを付ける
一つは、変数にfinal修飾子を付ける事です。
finalが付いた変数に再代入しようとするとコンパイルエラーが発生して、プログラムが実行出来ません。
つまり、finalを付ける事で明示的に変数への再代入を禁止する事が出来ます。
これなら、finalが付いた変数は再代入されない事が保証されているので、再代入出来る事によって発生する余計な考慮は不要ですね。
また、全ての変数にfinalを付けて実装することで、変数への再代入の無いプログラムが完成します。
逆にfinalを付けれない変数があるという事は実装を見直すための気付きになるかもしれません。
例えば、参照渡しによって思わぬバグが発生してしまうなどの実装を防ぐ事が出来ます。

メソッドの引数も変数なので忘れないようにfinalを付けて実装して下さい。
オブジェクトにsetしない
classをnewして作成したインスタンスに後から値をsetする処理もあまり良いソースコードとは呼べません。
そのため、後から値をsetするのではなく、newする時に初期値としてsetする事で処理を実現しましょう。
つまり、classをnewする時はコンストラクタで初期値をセットした状態でnewします。
このオブジェクトを使いまわす事で、オブジェクトへの再代入をしない実装が実現出来ます。
こちらは、場合によっては難しい場合もあるのですが、普段から気を付ける事で良いソースコードになるので是非覚えておきましょう。
まとめ
今回は、イミュータブルな実装で変更に強いソースコードが出来上がる方法と理由についてご紹介してきました。
単純に、オブジェクトや変数に再代入をしない実装をするだけではなく、再代入しない実装をする上で出てくる問題について工夫を凝らして解決する事で変更に強いソースコード、良いソースコードになっていきます。
明日からでも、イミュータブルな実装を心掛けてみて下さい。
他にも、変更に強いソースコードを書くテクニックはたくさんあります。
合わせて理解する事で、より良いソースコードを書く事が出来るようになり、貴重な技術者として重宝されるようになります。
是非、読んでみて下さい。

