「不変(immutable)」なオブジェクトについての最初の考え方

2023/01/15に公開

はじめに

「不変(immutable)」 について、もう少し詳しく知りたいと思い、一つの記事としてまとめた。

「不変(immutable)」とはなにか?

weblio辞典にて、

イミュータブル (英: immutable) なオブジェクトとは、
作成後にその状態を変えることのできないオブジェクトのことである。

とある。

※ オブジェクトのうちでもここでは「インスタンス」に関して述べる。

つまり、
「状態を変えることのできない」 = 不変
と考えれば良い。

「状態」とはなにか?

インスタンスにおける「状態」とは、すなわち
プロパティ(フィールド)(メンバ変数) のことである。

「状態を変えることができない」とは?

ゆえに、「状態を変えることができない」 = 不変(immutable)
なインスタンスとは、作成後
プロパティ(フィールド)(メンバ変数)を変更することができない のだ。

「不変(immutable)」なオブジェクトの扱い方

プロパティ(メンバ変数)を変えることができない。
つまり、オブジェクト丸ごと、新しいものに置換せねばならない
というわけである。

ここで、わかりやすく理解しやすい文献を見つけたので引用する。
画像
引用元:ボトムアップドメイン駆動設計 前編
(引用元の文献にて内容を確認される際は、「値オブジェクト」および「ドメイン駆動設計」も同時に考えると良い)

上記の画像には、数値、文字列、そしてインスタンスがあるが、
ここで意識していただきたいのは、インスタンスを数値や文字列と同次元なものとみなす
場合である。
すなわち、インスタンスさえも値として用いようと考える場合である。
(これが「値オブジェクト」の基本的な考え方である)

ここで、本来数値や文字列にプロパティはないため、
これらも「オブジェクト」とみなした場合、
値を変更する場合は無意識にオブジェクトそのものの入れ替えを行っているのである。

つまりインスタンスに関しても同様に、
インスタンスのプロパティだけを変更するのでなく
インスタンスを丸ごと置き換えて変更しようというわけである。
(copyWithメソッドで、特定のプロパティだけコピーして新規作成することもできる)

参考文献

ボトムアップドメイン駆動設計 前編

おわりに

初心者ゆえ、わかりにくい表現や、不適切な情報を記載している可能性があります。
その場合はご指摘いただけると助かります。

ご閲覧いただきありがとうございました。

Discussion