Глобальная переменная (или альтернативная) лучшая практика в .NET - PullRequest
11 голосов
/ 03 февраля 2009

Как лучше всего хранить глобальные переменные в приложении VB.NET WinForms. Например, когда пользователь входит в приложение, вы можете сохранить объект CurrentUser, к которому можно получить доступ во всем приложении. Вы можете сохранить это как объект в модуле или создать класс, который содержит члены для всех необходимых глобальных переменных, но вам все равно нужно будет где-то хранить этот экземпляр.

Предоставляет ли фреймворк простое решение для этого?

Ответы [ 6 ]

15 голосов
/ 03 февраля 2009

Я думаю, что «нет» немного грубовато, вот цитата Стива Макконнелла:

Используется с дисциплиной, глобальными переменными полезны в нескольких ситуациях

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

Сразу после завершения кода "Tour de Force" есть несколько причин для использования глобальных данных:

  • Сохранение глобальных значений
  • Оптимизация использования чрезвычайно распространенного данные
  • Устранение данных бродяги

Макконнелл также говорит:

Использование глобальных данных только в качестве крайней меры. Прежде чем прибегнуть к использованию глобальных данные, рассмотрим несколько альтернатив.

вот альтернативы, которые он перечисляет:

  • Начните с того, что сделайте каждую переменную локальной и сделать переменные глобальными только так, как вам нужно
  • Различают глобальное и классовое переменные
  • Использовать процедуры доступа

Вещи, о которых я упоминал, широко освещаются в фантастической книге Код завершен

8 голосов
/ 03 февраля 2009

Существует приблизительно одна лучшая практика использования глобальных переменных.

"не делать".

(Если это звучит грубо, учтите, что такие вещи, как CurrentUser обычно принадлежат чему-то, что среда уже поддерживает для вас уникальный экземпляр, например, Session. Найдите API, чтобы получить текущий сеанс храните там своего текущего пользователя и извлекайте его оттуда. Не создавайте свои глобальные переменные, которые сделают ваше приложение более трудным в обслуживании и уязвимым для условий гонки.)

4 голосов
/ 03 февраля 2009

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

3 голосов
/ 03 февраля 2009

Использование статических / глобальных переменных крайне вредно для тестируемости вашего кода, поскольку тест не может быть уверен, что объекты, которыми он манипулирует, не вызывают побочных эффектов в, казалось бы, не связанных областях кода.

Если у вас есть класс, которому нужен экземпляр класса CurrentUser, заставьте его запросить его в своем конструкторе.

Смотрите здесь для получения дополнительной информации: http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

1 голос
/ 11 июля 2009

Моя практика - помещать глобальные переменные, такие как CurrentUser , ConfigFilePath и аналогичные, в program.vb (класс запуска с sub main ). Таким образом, никто не использует бессмысленно глобальные переменные, так как к ним нужно обращаться через пространство имен program .

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

Нет способа избежать использования глобальных переменных. ИМХО, лучше называть их реальными именами и использовать их осторожно, а не маскировать их в одиночных файлах, сеансах или файлах.

0 голосов
/ 03 февраля 2009

Синглтон безопаснее, чем садовый сорт в мире.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...