Должны ли функции объявляться с минимальной областью действия? - PullRequest
2 голосов
/ 17 сентября 2010

По моему опыту, большинство JS-функций, функций-конструкторов или функций-шаблонов объявляются как глобальные или связаны с глобальным объектом пространства имен.В любом случае, эти идентификаторы доступны по всему миру.

Из любой строки кода в вашей системе вы можете получить:

mod1 = somepackage.SomeModule(); // couple to me!

Вот краткий пример JS, но на других языках эта идея применима.

function A () { // couple to me!
  return { foo: "bar" };
};

(function () {
  function B () { // don't couple to me!
    function c () { // really don't couple to me!
      return "buzz";
    };
    return { fizz: c() }; // 0 scope lookup
  };
  var a = A(); // 1 scope lookup
  var b = B(); // 0 scope lookup
})();

var a1 = A(); // 0 scope lookup
var b1 = B(); // B is not defined

Поскольку глобальные переменные считаются вредными, насколько должна быть ограничена видимость функций / классов?Каковы компромиссы?

Мой вопрос несколько мотивирован: ' когда приемлемы глобалы ', ' альтернативы глобалам ' и ' возвратглобалы '

Спасибо!

1 Ответ

2 голосов
/ 17 сентября 2010

Ну, всегда лучше начать с минимального объема, который вы можете увеличить, если есть требования. Но если вы сделаете все публично с первого раза, тогда будет действительно очень трудно (почти невозможно) минимизировать область видимости, так как вам придется реорганизовывать / исправлять другой код в процессе.

Это одна из главных вещей при разработке API.

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

...