あなた: 「関数型プログラミングについてよく聞きます。クールに聞こえますが、実際には何ですか? JavaScript ですでに行っていることとどう違うのですか?」
私: 素晴らしい質問ですね!段階的に説明し、関数型プログラミング (FP) と従来の命令型コーディングを比較してみましょう。
命令型プログラミングでは、何かを行う方法について段階的な指示を書きます。変数の更新、ループの使用、状態の直接変更など、一連のタスクがすべてです。
関数型プログラミングでは、何をしたいに焦点を当てます。純粋関数を使用し、直接の変更を避け、map、filter、reduce などの宣言型ツールを活用します。
ユーザーのリストを管理するための CRUD (作成、読み取り、更新、削除) シナリオを使用した 並べた例 でこれを見てみましょう。
元の配列を変更する命令的な例を次に示します。
let users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; function addUser(users, newUser) { users.push(newUser); // Directly modifies the array } addUser(users, { id: 3, name: 'Charlie' }); console.log(users);
問題:
これは関数型のアプローチであり、配列を変更する代わりに新しい配列を返します。
const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const addUser = (users, newUser) => [...users, newUser]; // Returns a new array const newUsers = addUser(users, { id: 3, name: 'Charlie' }); console.log('Original:', users); console.log('New:', newUsers);
特典:
配列内のオブジェクトを直接変更する例を次に示します。
let users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; function updateUser(users, id, newName) { for (let i = 0; i < users.length; i++) { if (users[i].id === id) { users[i].name = newName; // Directly mutates the object break; } } } updateUser(users, 1, 'Alicia'); console.log(users);
問題:
マップと不変性を使用して機能的にそれを行う方法は次のとおりです。
const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const updateUser = (users, id, newName) => users.map(user => user.id === id ? { ...user, name: newName } : user ); const updatedUsers = updateUser(users, 1, 'Alicia'); console.log('Original:', users); console.log('Updated:', updatedUsers);
特典:
ループと直接変更を使用した命令型バージョンは次のとおりです。
let users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; function addUser(users, newUser) { users.push(newUser); // Directly modifies the array } addUser(users, { id: 3, name: 'Charlie' }); console.log(users);
問題:
フィルターを使用すると、宣言的に意図を表現できます。
const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const addUser = (users, newUser) => [...users, newUser]; // Returns a new array const newUsers = addUser(users, { id: 3, name: 'Charlie' }); console.log('Original:', users); console.log('New:', newUsers);
特典:
Aspect | Imperative | Functional |
---|---|---|
Data Mutation | Mutates the original data (e.g., push, splice) | Avoids mutation; creates new data structures |
Readability | Step-by-step, more verbose | Declarative and concise |
Side Effects | More prone to unexpected side effects | Pure functions eliminate side effects |
Focus | How to achieve a task (manual looping) | What to achieve (use higher-order functions) |
Tools Used | Loops, conditionals | map, filter, reduce, spread operator |
? 関数型プログラミングを選ぶ理由
コードの推論とテストが容易になります。 副作用を回避するとバグが発生する可能性が低くなります。 より簡潔
かつ宣言的なので、精神的な負担が軽減されます。
以上が関数型プログラミングとは何ですか?JavaScript でどのように実行できるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。