【问题标题】:Assigning procs to constants将过程分配给常量
【发布时间】:2013-06-08 12:49:50
【问题描述】:

我发现 procs 和 lambdas 可以用作短方法和辅助模块的替代品。我将不属于其他任何地方的方法放入一个文件中,该文件只是分配给常量的过程列表。例如,init.rb 需要一个文件helper_procs.rb,它包含以下内容:

RED_TEXT = proc{|t| "\e[31m#{t}\e[0m"} 
GREEN_TEXT = proc{|t| "\e[32m#{t}\e[0m"}
YELLOW_TEXT = proc{|t| "\e[33m#{t}\e[0m"}

CURRENT_TIME = proc do
  date = Time.now.to_s.split(' ')[0].split('-').reverse.join('-')
  time = Time.now.to_s.split(' ')[1]; "#{time} (#{date})"
end

然后,在程序中的任何地方(在不同的文件中),我都会这样做:

puts GREEN_TEXT["A string!"]
puts CURRENT_TIME.call

这是不好的做法吗?有没有陷阱?

【问题讨论】:

    标签: ruby lambda constants proc


    【解决方案1】:

    这是一种不好的做法。在主级别定义常量与使用全局变量一样糟糕。这违背了面向对象编程 (OOP) 的目的。在 OOP 中,您希望尽可能地隐藏不必要的东西。如果某些东西总是在字符串上起作用,那么它不应该在字符串的上下文之外访问,并且应该在 String 类上定义。如果某事总是提供某种形式的时间,那么应该在 Time 类上定义它,根据方法的性质将其定义为类或实例方法。

    【讨论】:

    • 虽然在一个完美的世界里我同意你的观点,但猴子补丁也不是很好,这就是你的建议。此外,顶级常量并不像全局变量那么糟糕。此外,作为一个 Ruby 挑剔者,放置常量的顶级模块是常量。哈。 ;)
    • Ruby 鼓励猴子修补。如果这是一个问题,那就是改进的目的。常量是指模块以外的常量。
    • 我知道。我在吹毛求疵。然而,更严肃的一点是,在改进出现之前,猴子补丁在库和大型代码库中是不受欢迎的。
    • 因为 Rails 是一个全新的应用环境。对于实际上必须与其他库合作或没有其他人让他们的东西与之合作的小型库,不猴子补丁可能相当重要。
    • 所以本质上我应该做一些类似于 class String def red_text 然后 "\e[31m#{self}\e[0m"?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多