Почему не используются глобальные (долларовые знаки)?

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

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

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

Ответ 1

Это из-за проблем с дефектами дизайна?

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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