テクニック

イミュータブルな実装で変更に強く高品質なソースコードへ

プログラム

変更に強く、高品質なソースコードの書き方のテクニックとしてイミュータブルな実装についてご紹介します。

近年、システムやプログラムはアップデートして新機能の追加や改善を繰り返してサービスを継続するものが多くなってきています。

問題を起こさずにサービスを運営していくには、システムを構築しているプログラムの質が大切です。

つまり、高品質なソースコードと、高品質なソースコードを書ける技術者が求められています。

特に重宝されているのが、「変更に強いソースコード」です。

変更に強いソースコードというのは、後からプログラムに新機能の追加や改良を加える際のコストが低く、機能の追加によってバグが発生しにくい構造のソースコードです。

強い
変更に強いソースコードが重要視される時代この記事では、変更に強いソースコードの重要性をご紹介します。 システム構築の際に、既存のソースコードに修正を加えたとき、思ってもい...

変更に強いソースコードを書くテクニックは様々な物がありますが、今回はその中でもイミュータブルな実装についてご紹介していきます。

特に、初心者の人が覚えておくと、後々苦労が減ると思いますのでよりオススメです。

Java言語を前提に話しを進めていきますが、イミュータブルは思想の話なのでどのプログラミング言語に置き換えて貰っても問題無いかと思います。

イミュータブルとは?

「イミュータブル(Immutable)」を直訳すると「不変」という意味になります。

その意味の通り、作成したオブジェクトの状態を後から変更出来ないように実装する事をイミュータブルな実装と呼びます。

つまり、一度作成したオブジェクトや変数に値を再代入しないで実装を行うという事です。

当然、「本当に再代入を行わないでプログラミングが出来るのか?」という疑問もあると思います。

ですが、例えばWebシステムに当てはめて考えると、基本的にはリクエストに対して必要な処理を行ってレスポンスを返すという一方通行な実装をする場合は再代入を必要とする場合はほとんどありません。

そして、この一方通行な思想が変更に強いソースコードには必要な考え方になります。

つまり、処理が様々な関数を循環するような実装は不適切で、イミュータブルな実装を行う事で自然と一方通行な実装になり、ソースコードの品質が高くなります。

もしも、再代入をたくさん使っているという実装をしているならば、そのプログラムの設計や実装方法を見直したほうが良いです。

イミュータブルのメリット

では、具体的にイミュータブルな実装におけるメリットについてご紹介します。

  1. イミュータブルな実装を守る事で、自然とソースコードの質が上がる
  2. オブジェクトや変数が後から変更されない事が保証されていると、ソースコードを解読する時間が短縮出来る
  3. バグを減らす事が出来る

①は、イミュータブルな実装を行う事である程度プログラミングのルールが定まります。

例えば、変数の再代入を禁止する事によって、再代入をしない実装を実現する必要があるので、場合によっては実装方法の見直しや工夫をする必要が出てきます。

そうする事で、結果的にルールに定まったプログラミングが出来るので、ソースコードの質が上がります。

②は、予めオブジェクトや変数が変更されないという前提があることで、読む必要の無いソースコードを省略する事が出来ます。

例えば、メソッド呼び出しの引数に配列を渡す実装があると、その呼び出したメソッドの中身を確認しないと引数で渡した配列の値が変わっているかどうかがわかりません。

しかし、後から変更されない事が保証されていると、メソッドの中身を確認しなくても変数に変更が無い事がわかります

③は、オブジェクトや変数の中身がどこかで勝手に変わってしまう事が影響して発生するバグが起きないようになります。

このように、イミュータブルな実装はソースコードの質を上げるのに不可欠な要素なのです。

イミュータブルな実装方法

では、実際にイミュータブルな実装方法についてご紹介します。

気を付ける事は多くはありませんが、イミュータブルな実装になるように工夫を凝らすのは場合によってはコツが必要になるかもしれません。

変数にfinalを付ける

一つは、変数にfinal修飾子を付ける事です。

finalが付いた変数に再代入しようとするとコンパイルエラーが発生して、プログラムが実行出来ません。

つまり、finalを付ける事で明示的に変数への再代入を禁止する事が出来ます。

これなら、finalが付いた変数は再代入されない事が保証されているので、再代入出来る事によって発生する余計な考慮は不要ですね。

また、全ての変数にfinalを付けて実装することで、変数への再代入の無いプログラムが完成します。

逆にfinalを付けれない変数があるという事は実装を見直すための気付きになるかもしれません。

例えば、参照渡しによって思わぬバグが発生してしまうなどの実装を防ぐ事が出来ます。

いつまで経っても理解出来ない参照渡し・値渡しに終止符を
いつまで経っても理解出来ない参照渡し・値渡しに終止符を【図解・Java】プログラミング言語の一つの壁である、参照という考え方。 何度説明を聞いてもなかなか理解出来ない人もいると思います。 もし、理...

メソッドの引数も変数なので忘れないようにfinalを付けて実装して下さい。

オブジェクトにsetしない

classをnewして作成したインスタンスに後から値をsetする処理もあまり良いソースコードとは呼べません。

そのため、後から値をsetするのではなく、newする時に初期値としてsetする事で処理を実現しましょう。

つまり、classをnewする時はコンストラクタで初期値をセットした状態でnewします

このオブジェクトを使いまわす事で、オブジェクトへの再代入をしない実装が実現出来ます。

こちらは、場合によっては難しい場合もあるのですが、普段から気を付ける事で良いソースコードになるので是非覚えておきましょう。

まとめ

今回は、イミュータブルな実装で変更に強いソースコードが出来上がる方法と理由についてご紹介してきました。

単純に、オブジェクトや変数に再代入をしない実装をするだけではなく、再代入しない実装をする上で出てくる問題について工夫を凝らして解決する事で変更に強いソースコード、良いソースコードになっていきます

明日からでも、イミュータブルな実装を心掛けてみて下さい。

他にも、変更に強いソースコードを書くテクニックはたくさんあります。

合わせて理解する事で、より良いソースコードを書く事が出来るようになり、貴重な技術者として重宝されるようになります。

是非、読んでみて下さい。

読みやすい綺麗なソースコードを書く5つの掟【初心者必見】この記事では、プログラマとして必須スキルの綺麗なソースコードの書き方をご紹介します。 プログラマーなら知っていて当たり前、でも最初...
良いソースコードの書き方紹介!4つのポイントで自身のスキルと周りの評価がアップする方法!この記事では、ソースコードの記述テクニックをご紹介します。 プログラマとして、良いソースコードを記述するのに必須のテクニックです。...

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です