参照透過性
・同じ引数で呼び出した関数は常に同じ結果を返却するという性質
つまり、関数が外部の状態を変更せず、引数だけに依存して結果を返す性質
・参照透過性の保持と副作用がない関数を純粋関数という
副作用とは
・グローバル変数の読み書きや、外部のサービスへの通信など、
外部の要因によって関数の結果が変わってしまう物の事を言います。
→プログラムの予測可能性やテスト容易性が低下する
副作用のある例
let counter = 0;
function incrementCounter() {
counter += 1; // 外部の変数 counter を変更
}
incrementCounter();
console.log(counter); // 1
incrementCounter();
console.log(counter); // 2
例)
グローバル変数の読み書き
静的ローカル変数の読み書き
ファイルの読み書き
他のコンピュータやプロセスとの通信
DBの読み書き
標準出力/入力
システムコール
乱数の取得
現在日時の取得
...etc
immutability
・イミュータブルなコードだと挙動が予測可能になる。
・ミュータブルなコードだと、ドキュメントの精査、様々なパターンでの実行、あるいはコードの読解などの調査が必要になる
Javascriptのコピーメカニズム
プリミティブタイプ
・Javascriptで変数などを宣言したら、その変数はパソコンのメモリに保存される。
プリミティブタイプの変数はコピーする際に新しいメモリ空間を確保して独立的な値を保存する。
つまり、違うメモリに保存される。
オブジェクトタイプ
・プリミティブタイプのように新しいメモリに保存するのではなく、原本のメモリアドレスを渡される。
つまり、原本とコピー本が同じメモリに保存されている同じデータを共有する。
→シャローコピーとディープコピーで解決
プログラミング手法の違い
手続き型(命令型)
・プログラムを手続きや手順の連続として捉えるアプローチ
// 手続き型プログラミングのスタイル
let sum = 0;
for (let i = 1; i <= 5; i++) {
sum += i;
}
console.log(sum); // 結果:15
宣言型
・プログラムが「何をするか」を宣言し、コンピュータがそれをどのように実現するかは隠蔽するアプローチ
→関数型とか論理型とかがある
// 宣言型プログラミングのスタイル
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(sum); // 結果:15
オブジェクト指向
・いわずもがな