【问题标题】:Why aren't global (dollar-sign $) variables used?为什么不使用全局(美元符号 $)变量?
【发布时间】:2011-08-21 02:42:31
【问题描述】:

我已经在 Rails 上进行了一年半的编程,我非常喜欢它! :)

在 Rails 中,我们大量使用局部变量、实例变量(如 @user_name)和在初始化程序中定义的常量(如 FILES_UPLOAD_PATH)。但是为什么没有人使用像$dynamic_cluster_name 这样的全局“美元化”变量($)?

是因为设计缺陷吗?与性能有关吗?安全漏洞?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    全局变量通常是设计不良的标志,并且可能是由于并发问题而导致的错误来源。全局常量实际上没有这些问题。

    考虑使用单例或类变量,而不是使用全局变量。这样,您可以将共享状态的访问权限限制在一小部分代码中,从而更容易避免这些问题。

    【讨论】:

      【解决方案2】:

      是因为设计缺陷问题吗?

      设计...缺陷?那是设计的祝福,设计的恩惠,设计的优点,除了缺陷之外的一切!全局变量are bad,它们在Web 应用程序中尤其很糟糕。

      使用全局变量的意义在于保持和改变“全局状态”。它在简单的单线程脚本中运行良好(不,不是很好,它运行糟糕,但仍然可以运行),但在网络应用程序中却不行。大多数 Web 应用程序运行并发后端:即通过公共代理和负载均衡器响应请求的多个服务器实例。如果您更改全局变量,它只会在 一个 的服务器实例中被修改。本质上,当您使用 Rails 编写 Web 应用程序时,美元符号变量不再是全局变量

      然而,全局常量仍然有效,因为它们是常量,它们不会改变,并且在不同的服务器中有多个它们的实例是可以的,因为它们在那里总是相等的。 p>

      要存储可变全局状态,您必须使用更复杂的工具,例如数据库(SQL 和 noSQL;ActiveRecord 是访问数据库的一种非常好的方式,使用它!)、缓存后端(memcached),甚至是普通文件(在极少数情况下它们很有用)!但是全局变量根本不起作用。

      【讨论】:

      • 是的,我知道全局变量不是跨线程共享的,它们的使用意味着糟糕的软件设计,但它们在某些情况下不是很有用吗?例如,我们对路由有一个约束,主要是为了检查数据库自定义域名。为了避免对我们的数据库(路由和控制器)的两个请求,我正在考虑使用全局变量。这就是我想知道的原因。
      • @Hartator,好吧,在这种情况下,您要存储的数据不是“全局的”,它们是“特定于请求的”(让我们暂时搁置一下,请求是用 AFAIK 实现的使用“全球”的东西)。我会尝试以某种方式将它们附加到request,并从那里获取,尽可能避免使用美元符号。而且,当然,我还要确定这些请求中的第二个是否实际上没有解析到 Rails 的数据库缓存。
      • 如何将一些东西附加到请求对象上?我以为它是只读的。
      【解决方案3】:

      明显缺乏全局使用是全局变量概念缺陷的一个指标,而不是 ruby​​ 对它们的实现。事实上,我什至不知道 ruby​​ 有 $global 语法。它们不是必需的,所以我从来没有找过它们。好的 ruby​​ 代码永远不需要它们。

      【讨论】:

        【解决方案4】:

        我曾经使用它们在基于 Web 的 FTP 客户端的 AJAX 调用中保持 FTP 连接有效。这允许用户重复与他们的 FTP 站点交互,而不必每次执行的每个操作都重新连接。

        因此,Ruby 中全局变量的一大好处是您可以在其中安全地存储资源类型对象。

        【讨论】:

          猜你喜欢
          • 2011-11-10
          • 2011-07-06
          • 1970-01-01
          • 2019-01-20
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 2015-05-31
          相关资源
          最近更新 更多