Если глобальные перемены плохие, почему каждый веб-фреймворк использует их? - PullRequest
2 голосов
/ 25 марта 2012

Каждая инфраструктура веб-разработки, с которой я сталкивался, включая лучшие разработанные (Web2Py, Kohana), использует некоторую форму глобальных переменных для представления объектов, которые являются глобальными в домене приложения, например, объекты, представляющие запрос.и «ответ».

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

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

Ответы [ 3 ]

6 голосов
/ 25 марта 2012

Что такое глобальный? Взяв ваш текст, я предполагаю, что вы имеете в виду переменную, которая объявлена ​​в глобальной области видимости. Такая переменная может быть переопределена любым назначением и нарушить существующую функциональность.

Однако в ОО-языках все находится внутри класса, и присваивание может быть заключено в gettors и settors для свойств или полностью скрыто за методами. Это дает безопасный способ борьбы с глобалами. Обратите внимание, что в надлежащих языках OO (Java, C #, VB.NET и т. Д.) невозможно иметь глобальные переменные (иногда языковая конструкция предполагает иное, но статические поля в C # или модули в VB, смешиваются в Все Ruby заключены в классы и поэтому не являются глобальными).

Синглтон, вы упомянули об этом, - это особый вид глобальности. Как дизайнер, вы можете контролировать количество запущенных экземпляров. Автомобилю нужен только один двигатель, стране только одно правительство (или война развязывается), а программе нужен только один главный поток. Глобалы - это необходимость в программировании, настоящей дискуссии не должно быть, нужны ли они нам, но как правильно их создавать и использовать.

Вы говорите, что объекты запроса и ответа являются глобальными в веб-разработке. Они не. Это (обычно, в зависимости от вашего набора инструментов) вспомогательные переменные, устанавливаемые в области видимости до запуска вашего кода. Поскольку веб-приложение может иметь несколько объектов запроса в любой момент времени, я думаю, что это плохой пример глобальной переменной. Это не так (но они, как правило, локальные и одноэлементные для вашего текущего потока).

Одной важной особенностью, которую вы не можете охватить в традиционных процедурных языках (таких как Basic, Pascal, C), является управление доступом и, таким образом, параллелизм и безопасность потоков для глобальных переменных. Например, в .NET любой статический метод или свойство в BCL (можно сказать, что любая статическая переменная является глобальной по определению) является поточно-ориентированным. Рекомендации для пользовательских статических методов или свойств предполагают, что вы делаете то же самое.

РЕДАКТИРОВАТЬ: опасность связана с языками, которые допускают глобальные переменные, но в то же время распространяются как действительно ОО. Хотя это замечательные языки, действительно опасно выходить из-под защиты ОО и создавать глобальные переменные, например, в Perl, Python, Ruby, PHP.

2 голосов
/ 25 марта 2012

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

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

1 голос
/ 25 марта 2012

Глобальные переменные совсем не плохие. Особенно, если он глобален только в диапазоне объектов. Иногда нет другого способа создать чистый код без них. Но, насколько это возможно, по соображениям безопасности они должны быть частными и могут использоваться с методами установки / получения. Основное значение идеи «плохих глобальных переменных» - безопасность и защита от ошибок.

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