我已经在Rails上破解了一年半了,我非常喜欢它! :)
在 rails 中,我们大量使用局部变量、实例变量(如 @user_name
)和在初始值设定项中定义的常量(如 FILES_UPLOAD_PATH
)。但是为什么没有人像$dynamic_cluster_name
那样使用全局"美元化"变量($)?
是因为设计缺陷吗?是否与性能有关?安全漏洞?
是因为设计缺陷问题吗?
设计。。。缺陷? 这是设计的祝福,设计的好处,设计的优点,除了缺陷之外的一切! 全局变量很糟糕,在 Web 应用程序中尤其糟糕。
使用全局变量的意义是保持和改变"全局状态"。 它在简单的单线程脚本中运行良好(不,不好,它工作得很糟糕,但仍然有效),但在 Web 应用程序中它就是不行。 大多数 Web 应用程序运行并发后端:即通过公共代理和负载均衡器响应请求的多个服务器实例。 如果更改全局变量,则仅在其中一个服务器实例中对其进行修改。 从本质上讲,当您使用轨道编写 Web 应用程序时,美元符号变量不再是全局变量。
但是,全局常量仍然有效,因为它们是常量,它们不会改变,并且在不同的服务器中拥有它们的多个实例是可以的,因为它们在那里总是相等的。
要存储可变的全局状态,您必须使用更复杂的工具,例如数据库(SQL 和 noSQL;ActiveRecord是访问数据库的非常好的方法,使用它!),缓存后端(memcached),甚至是普通文件(在极少数情况下它们很有用)! 但是全局变量根本不起作用。
全局变量通常是设计不佳的标志,并且由于并发问题,可能是错误的根源。全局常量实际上没有这些问题。
请考虑使用单例或类变量,而不是使用全局变量。这样,您可以将对共享状态的访问限制为代码的一小部分,从而更轻松地避免这些问题。
我曾经使用过它们来保持基于Web的FTP客户端的AJAX调用之间的FTP连接。这允许用户重复与其FTP站点交互,而无需每次执行每个操作时都重新连接。
因此,Ruby 中全局变量的一个好处是,您可以安全地将资源类型对象存储在其中。
明显缺乏全局变量的用法表明全局变量概念存在缺陷,而不是 ruby 对它们的实现。 事实上,我甚至不知道 ruby 有$global语法。 他们不需要,所以我从来没有找过他们。 好的红宝石代码永远不需要它们。