我现在正在攻击Rails一年半,我非常喜欢它!:)
在rails中,我们大量使用局部变量,实例变量(如@user_name
)和初始化器中定义的常量(如FILES_UPLOAD_PATH
).但为什么没有人使用全球"美元化"变量($)$dynamic_cluster_name
?
是因为设计缺陷吗?它与性能有关吗?安全漏洞?
是因为设计缺陷问题吗?
设计...... 缺陷?这是一个设计的祝福,设计的恩惠,设计的优点,一切,但缺陷!全局变量很糟糕,它们在Web应用程序中尤其糟糕.
使用全局变量的意义在于保持和改变" 全球状态 ".它在一个简单的单线程脚本中运行良好(不,不好,它工作糟糕,但仍然有效),但在Web应用程序中却没有.大多数Web应用程序运行并发后端:即通过公共代理和负载均衡器响应请求的多个服务器实例.如果更改全局变量,则仅在其中一个服务器实例中进行修改.从本质上讲,当您使用rails编写Web应用程序时,美元符号变量不再是全局变量.
然而,全局常量仍然有效,因为它们是常量,它们不会改变,并且在不同的服务器中有几个实例是可以的,因为它们在那里总是相等的.
要存储可变的全局状态,您必须使用更复杂的工具,例如数据库(SQL和noSQL; ActiveRecord是一种非常好的方式来访问数据库,使用它!),缓存后端(memcached),甚至普通文件(在极少数情况下它们很有用)!但全局变量根本不起作用.
全局变量通常是设计错误的标志,并且可能是由于并发问题导致的错误源.全局常量实际上没有这些问题.
不要使用全局变量,而应考虑使用单例或类变量.这样,您可以将对共享状态的访问限制为代码的一小部分,从而更容易避免这些问题.