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