Node.jsで開発を行う際、関数の外で定義した配列などの変数が、意図せず変更されることがあります。
特に、複数の開発者が関わるプロジェクトでは、変数の意図しない変更がバグの原因となることが多く、コードの保守性やデバッグのしやすさに影響を与えます。
この記事では、グローバル変数の意図しない変更を防ぐ方法を詳しく解説し、実際のコードを用いた対策方法を紹介します。
変数が意図せず書き換えられる問題とは?
たとえば、以下のようなコードを考えてみます。
const tableFields = [ 'id', 'role_id', 'user_id', 'delete_flg', 'update_dt' ]; const getTableFields = () => { return tableFields; }; const getData = () => { tableFields.push('test'); // ここで意図せず変更される return tableFields; }; console.log(getData()); // ['id', 'role_id', 'user_id', 'delete_flg', 'update_dt', 'test'] console.log(getTableFields()); // ['id', 'role_id', 'user_id', 'delete_flg', 'update_dt', 'test']
このコードでは、getData()
を実行するたびに tableFields
に test
が追加され、他の関数からも変更された配列が見えてしまいます。
この問題を防ぐために、配列の変更を制限する方法を考えます。
解決策1:配列のコピーを返す
元の配列を直接返さずに、コピーを作成して返すことで、外部からの変更を防ぎます。
修正コード
const tableFields = [ 'id', 'role_id', 'user_id', 'delete_flg', 'update_dt' ]; const getTableFields = () => { return [...tableFields]; }; // スプレッド構文でコピー const getData = () => { const fields = getTableFields(); fields.push('test'); // 変更は getData の内部のみで有効 return fields; }; console.log(getData()); // ['id', 'role_id', 'user_id', 'delete_flg', 'update_dt', 'test'] console.log(getTableFields()); // ['id', 'role_id', 'user_id', 'delete_flg', 'update_dt']
この方法では getTableFields()
の戻り値がコピーされた配列なので、元の tableFields
は影響を受けません。
解決策2:変更不可の配列にする
Node.jsでは Object.freeze()
を使うことで、オブジェクト(配列も含む)を変更不可にできます。
修正コード
const tableFields = Object.freeze([ 'id', 'role_id', 'user_id', 'delete_flg', 'update_dt' ]); const getTableFields = () => tableFields; const getData = () => { // tableFields.push('test'); // 実行するとエラーになる return getTableFields(); }; console.log(getData()); // ['id', 'role_id', 'user_id', 'delete_flg', 'update_dt']
この方法では、tableFields
に対して push()
や pop()
を実行するとエラーが発生し、意図しない変更を防げます。
どちらの方法を選ぶべきか?
方法 | メリット | デメリット |
---|---|---|
配列のコピーを返す | 変更を防ぎつつ動的に要素を追加可能 | 都度コピーを作成するため、メモリ使用量が増える |
Object.freeze() を使う | 完全に変更を禁止できる | 配列の要素を追加できない |
複数の開発者が関わるプロジェクトでは、Object.freeze()
を使う方法がより安全ですが、一時的に変更する必要がある場合はコピーを返す方法が適しています。
まとめ
Node.jsでグローバル変数の配列を扱う際、意図せず変更される問題を防ぐ方法を解説しました。
- 配列のコピーを返す方法(スプレッド構文
[...]
を使用) - 変更不可にする方法(
Object.freeze()
を使用)
複数人で開発するプロジェクトでは、コードの可読性とデバッグのしやすさを考慮し、安全な設計を心がけましょう。
今回紹介した方法を活用し、バグの少ない堅牢なコードを目指してください!
- Original:https://minory.org/node-global-variables.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...