【问题标题】:How to avoid instance variable initializing ugliness如何避免实例变量初始化丑陋
【发布时间】:2015-04-15 21:27:48
【问题描述】:

我的代码中经常出现这种情况

class Foo
  def initialize(foo)
    @foo = foo
  end
  #...
end

这还不算太糟糕,但会变得更糟:

class Foo
  def initialize(foo,baz,bar,a,b,c,d)
    @foo = foo
    @baz = baz
    @bar = bar
    #etc...

你可以通过做类似的事情来解决这个问题

@foo, @baz, @bar = foo, baz, bar

但即使这样也感觉不对,而且打字很烦人。有没有更好的方法来根据参数定义实例变量?

编辑: 这个问题似乎有两种不同的解决方案。见:

【问题讨论】:

标签: ruby instance-variables


【解决方案1】:
def initialize args
  @foo, @baz, @bar = *args
end

【讨论】:

    【解决方案2】:

    您可能需要考虑使用Struct

    class Foo < Struct.new(foo,baz,bar,a,b,c,d)
    end
    
    foo = Foo.new(1,2,3,4,5,6,7)
    foo.bar #=> 2
    

    根本不需要定义额外的initialize 方法...

    【讨论】:

      【解决方案3】:

      是的,这是在 Ruby 中初始化实例变量的首选方式。打字可能很烦人,但这是一种很好理解的模式。与 Ruby 一样,使用元编程将其自动化是可能的,但会使您的代码更难遵循。

      我还认为,当一个类接受两个或三个以上的参数时,它看起来很丑可能是一件好事。如果您的类依赖于六种不同的东西来运行,那么它是重构的有力候选者。

      【讨论】:

        【解决方案4】:

        我认为有 3 种方法可以缩短实例变量的初始化时间:

        1. 使用 Struct 或 OpenStruct。
        2. 使用 ruby​​ 的并行赋值。
        3. 使用元编程制作像this 这样的宏。

        【讨论】:

          【解决方案5】:

          fattr gem 最近在 Ruby Tapas 上得到认可,以帮助解决这个问题。不过,另一个考虑因素是是否有太多的东西被传递到初始化程序中。可能是这个类做的太多了,需要分解成更小的部分。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多