【问题标题】:Is a global list variable okay in my app, or should I use an alternative?我的应用程序中的全局列表变量可以吗,还是应该使用替代方法?
【发布时间】:2015-10-28 07:13:54
【问题描述】:

我正在开发一款刽子手类型的游戏。我一直在阅读很多关于全局变量不好的文章,并且我想尽可能地使用最佳实践。话虽如此,我目前正在声明几个不同类别的变量,每个类别变量都包含一个单词列表供程序选择。

可以将它们声明为全局,还是应该将它们放在方法或类似的东西中?

它们永远不会被更改或类似的东西,它们只是被访问以便程序可以选择一个随机单词供玩家猜测。这样可以吗?

【问题讨论】:

    标签: ruby list variables global-variables


    【解决方案1】:

    全局变量通常不好。全局 constants(您似乎拥有)要好一些。

    只要使用正确的语法:

    $words = %w(foo bar) # bad, global var syntax
    WORDS = %w(foo bar) # good, syntax for constants
    

    虽然我会将该常量限定为某个模块或类,但不会污染全局命名空间。你不需要它真的是全球性的,对吧?像这样的:

    class Game
      WORDS = %(foo bar)
    end
    
    # then
    Game::WORDS
    

    更好的是,将这个常量隐藏在一个方法中:

    class Game
      def self.words
        %(foo bar)
      end
    end
    
    # then 
    Game.words
    

    这样,如果以后您需要从文件中读取单词列表,您只需更改方法的实现,其余代码无需修改。

    【讨论】:

    • 好吧,酷。这很有意义。我什至没有想过让它从文件中读取单词列表,这可能会使将来的事情变得容易得多。谢谢回复,帮了大忙。
    • @bshock84:顺便说一句,您应该接受对您的问题最有帮助的答案(在这种情况下,我的 :))。为此,请勾选答案左侧的复选标记。
    • 知道了,谢谢。我是这里的新帖子,已经阅读了一段时间。不过,我有一种感觉,我会经常待在身边。
    • @bshock84:潜伏两年后我开始发帖了:)
    【解决方案2】:

    我同意 Sergio 的观点,此外,我使用一种技术将此类变量存储在配置文件中,当您想要测试值或分发并与代码分离时,这很容易。我在此使用 yaml gem。 另外我使用 Structs 来保存常量或变量,它们是为这类数据设计的。

    这里是此类文件的示例

    --- !ruby/struct
      DEBUG_LEVEL: DEBUG #example of a constant
      database: !ruby/struct
        development: !ruby/struct
          tablename: tablename
          sequence: seq_osgn_rowversion
          connection:
            adapter: oracle_enhanced
            database: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = ORATCP.world)(PROTOCOL = TCP)(Host = hostname)(Port = 1526)))(CONNECT_DATA = (SID = SIDID)))
            username: user
            password: pass
    

    你像这样加载它们:

    require 'yaml'
    CONFIG = YAML::load_file("./config.yaml")
    

    并且像这样访问值

    connection = CONFIG.database.development
    

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2013-06-21
      • 1970-01-01
      • 2020-05-21
      • 2012-06-13
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多