データの不変性の保持 | イミュータビリティ | JavaScript 超完全入門 基本から発展までのすべて

現在作成中です。今後加筆修正してまいります。
スポンサーリンク
スポンサーリンク

データの不変性とは?

不変性(イミュータビリティ、Immutability)とは、一度作成されたデータが変更されない性質のことです。関数型プログラミングでは、データの不変性を保つことが重要です。これにより、データの変更による予期せぬ副作用を防ぎ、コードの予測可能性や保守性を高めます。

データの不変性を保つ理由

不変性を保つことにはいくつかの利点があります。以下の表にその利点をまとめました。

利点 説明
副作用の防止 データが変更されないため、予期せぬ変更が引き起こす副作用を防ぐことができる。
デバッグが容易 変更されないデータは、予測しやすくデバッグが容易になる。
安全な並列処理 不変なデータはスレッドセーフであり、並列処理や非同期処理においてデータ競合を避けられる。

データの不変性を保つ方法

JavaScriptでは、オブジェクトや配列などのデータ型が基本的にミュータブル(可変)です。しかし、データの不変性を保つために、オブジェクトや配列を変更する際には新しいデータを作成し、元のデータは変更しないという方法が用いられます。

不変なオブジェクトの作成方法

次に、不変なオブジェクトを作成する方法の例を示します。この例では、Object.assignを使って新しいオブジェクトを作成します。

const originalPerson = {
    name: 'Alice',
    age: 25
};

const updatedPerson = Object.assign({}, originalPerson, { age: 26 });

console.log(originalPerson);
console.log(updatedPerson);

出力: { name: ‘Alice’, age: 25 }
出力: { name: ‘Alice’, age: 26 }

この例では、originalPersonオブジェクトを直接変更せずに、新しいupdatedPersonオブジェクトを作成しています。これにより、元のオブジェクトは不変のまま、データを更新できます。

スプレッド構文を使った不変性の保持

さらに、スプレッド構文を使うことで、簡潔に不変なオブジェクトを作成することができます。

const updatedPerson2 = { ...originalPerson, age: 27 };

console.log(originalPerson);
console.log(updatedPerson2);

出力: { name: ‘Alice’, age: 25 }
出力: { name: ‘Alice’, age: 27 }

この方法では、Object.assignと同様に、元のオブジェクトを変更することなく、新しいオブジェクトを作成しています。

不変な配列の作成方法

配列でも同様に、不変性を保つために新しい配列を作成することが重要です。以下は、配列に要素を追加する例です。

const originalArray = [1, 2, 3];

const newArray = [...originalArray, 4];

console.log(originalArray);
console.log(newArray); 

出力: [1, 2, 3]
出力: [1, 2, 3, 4]

この例では、元の配列originalArrayを変更せずに、新しい要素を持つnewArrayを作成しています。元の配列はそのまま不変の状態を保っています。

不変性を保つためのツール

JavaScriptには、不変性を保つための専用ライブラリやツールもあります。例えば、Immutable.jsImmerなどがそれに該当します。これらのライブラリを使用すると、不変性を簡単に保ちながら効率的にデータを操作できます。

Immutable.jsの例

Immutable.jsを使うと、オブジェクトや配列の不変性を自然に保つことができます。

const { Map } = Immutable;

let originalMap = Map({ name: 'Alice', age: 25 });
let updatedMap = originalMap.set('age', 26);

console.log(originalMap.toObject());
console.log(updatedMap.toObject());

出力: { name: ‘Alice’, age: 25 }
出力: { name: ‘Alice’, age: 26 }

この例では、originalMapオブジェクトを変更せず、新しいupdatedMapを作成しています。

まとめ

関数型プログラミングにおいて、データの不変性は重要な概念です。データを変更せず、新しいデータを生成することで、副作用を避け、コードの予測可能性や保守性を高めることができます。

JavaScriptでは、Object.assignやスプレッド構文、ライブラリを活用して、データの不変性を保つことが可能です。特に、配列やオブジェクトの操作において、元のデータを変更せずに新しいデータを生成する手法を身につけておくと良いでしょう。