2013-09-05 4 views
1

В настоящее время я сталкиваюсь с проблемой, когда у меня есть два модуля, которые я называю, которые должны иметь возможность изменять одну и ту же переменную.
Я решил создать глобальную переменную под названием global.APP_NAME = {} и сохранить переменные, которые мне нужны.Почему глобальные переменные считаются плохой практикой? (node.js)

Но я читал, что использовать глобальные переменные - это плохая практика. Почему это?

Я создаю только одну переменную, которая не должна сталкиваться ни с чем другим, потому что это имя моего приложения.

+0

В общем, это плохая практика для перегрузки глобальной области. Одна переменная в порядке, но будет лучше, если у вас будут переменные в пространстве имен, например global.myProject = {...} –

+2

Сохранение всех возможных локальных мест позволяет избежать коллизий, но также улучшает читаемость кода, так как вам не нужно постоянно покидать локальную область, пытаясь понять ее. –

+0

Эта проблема не связана с каким-либо конкретным языком или платформой, это верно для всех языков. Не ограничивайте свое исследование просто node.js. Например, [этот вопрос] (http://codereview.stackexchange.com/questions/29130/global-variables-is-this-code-good-practice) задает почти то же самое для C++, и ответы все в основном так же важно для вашего дела. – Spudley

ответ

11

Глобальные переменные считаются анти-шаблонами практически на любом языке программирования, потому что они очень трудно отслеживать и отлаживать код.

  • Когда вы просматриваете код, вы никогда не знаете, какая функция задает или использует глобальную переменную. Когда все переменные являются локальными или передаются функции, вы можете быть уверены, что побочные эффекты функции ограничены.
  • Глобальные переменные работают на расстоянии. Привинчивание со значением глобального может иметь неожиданные эффекты в совершенно другой части приложения. Когда вы отлаживаете ошибку, вызванную этим, вам будет очень сложно узнать, где переменная была изменена на неправильное значение.
  • Глобальные переменные разделяют пространство имен, поэтому вы можете случайно повторно использовать их, хотя вы этого не намерены делать.
  • Трудно сказать, насколько важна глобальная переменная. Вы никогда не знаете, используется ли она только двумя функциями или если значение важно повсюду.
  • ... и много других причин ...

Если у вас есть два модуля, которые совместно используют данные, вы должны создать объект с этими данными и явно передать его к каждой функции, которая нуждается в этом (и только те, которые на самом деле делают).

+0

+1 Большое вам спасибо. Вы нашли лучший способ для того, что я пытался сделать. Я переключился на объект, и теперь он работает и быстрее глобального. – C1D

2

Вы можете прочитать из большинства комментариев, а другие ответы на вопрос, почему глобальная считается плохой практикой. Однако приложения node.js обычно запускаются из центральной точки, например «app.js», «server.js» или что-то подобное.

В этом случае вы можете сохранить какой-то «конфиг» (вы сказали, что вам нужны APP_NAME.users) в качестве опции конфигурации для этого файла. Таким образом, в «app.js» у вас есть:

var config = { 
    myVar: 100 
} 

Если вам необходимо получить доступ к этой переменной в некоторых из модулей, передать его в качестве параметра. Т.е. в глобальном файле называют его:

var module = require('./lib/myModule.js').init(config); 

Теперь ваш модуль может иметь это функция инициализации на экспорт, так что она устанавливает свою собственную локальную копию конфигурации. Пример:

var localConfig = null; 
exports.init = function(config) { 
    // merge the two config objects here 
    localConfig.myVar = config.myVar; 
} 

Наконец, вы можете связать локальный код с глобальным объектом с его личным значением. Что-то вроде этого в вашем модуле:

exports.modifyGlobalConfig = function() { 
    global.myVar = myLocalValue; 
} 

Ваш глобальный app.js затем использовал бы этот метод для изменения его глобального значения.

Смежные вопросы