Почему не используются глобальные (знак доллара $) переменные? - PullRequest
13 голосов
/ 08 мая 2011

Я хожу по Rails уже полтора года, и мне это очень нравится!:)

В rails мы широко используем локальные переменные, переменные экземпляра (например, @user_name) и константы, определенные в инициализаторах (например, FILES_UPLOAD_PATH).Но почему никто не использует глобальные «долларизованные» переменные ($), такие как $dynamic_cluster_name?

Это из-за недостатка дизайна?Это связано с производительностью?Слабость в безопасности?

Ответы [ 4 ]

40 голосов
/ 08 мая 2011

Это из-за недостатка дизайна?

Дизайн ... недостаток ?Это дизайнерское благо, дизайнерское благо, дизайнерские достоинства, все, кроме недостатков!Глобальные переменные плохие , и они особенно плохие в веб-приложениях.

Смысл использования глобальных переменных заключается в сохранении и изменении " global"состояние ».Он хорошо работает в простых однопоточных скриптах (нет, не хорошо, он работает ужасно , но, тем не менее, работает), но в веб-приложениях он просто не работает.Большинство веб-приложений используют параллельные бэкэнды: несколько экземпляров сервера, которые отвечают на запросы через общий прокси-сервер и балансировщик нагрузки.Если вы изменяете глобальную переменную, она изменяется только в одном экземпляров сервера.По сути, переменная со знаком доллара больше не является глобальной , когда вы пишете веб-приложение с рельсами.

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

Чтобы сохранить глобальное состояние mutable , вы должныиспользуйте более сложные инструменты, такие как базы данных (SQL и noSQL; ActiveRecord - очень хороший способ получить доступ к БД, используйте его!), кеш-серверы (memcached), даже простые файлы (в редких случаях они полезны)!Но глобальные переменные просто не работают.

5 голосов
/ 08 мая 2011

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

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

1 голос
/ 24 июня 2011

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

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

0 голосов
/ 08 мая 2011

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

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