
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...