Ruby类,传递给方法的参数,实例变量?

Ruby类,传递给方法的参数,实例变量?,ruby,oop,Ruby,Oop,我有一个问题,我想可能是代码的味道,我有一个类,它在初始化器中接收一个参数,包含一个公共和几个私有方法——一切正常。例如: class Foo def initialize(a) @a = a end def apply?(examples) foo_1(examples) end private def foo_1(examples) foo_2(examples) ? 1 : 2 end def foo_2(examples)

我有一个问题,我想可能是代码的味道,我有一个类,它在初始化器中接收一个参数,包含一个公共和几个私有方法——一切正常。例如:

class Foo
  def initialize(a)
    @a = a
  end

  def apply?(examples)
    foo_1(examples)
  end

  private

  def foo_1(examples)
    foo_2(examples) ? 1 : 2
  end

  def foo_2(examples)
    examples.size > @a
  end
end
我这里的问题是,公共方法接收到的“示例”在私有方法上反复出现,它看起来不漂亮,而且看起来像是一种代码味道,这里最好的方法是什么?将其作为公共方法内的实例变量


谢谢

是的,如果接受
示例
的私有方法的数量大于1-2,则这可能被视为代码气味

一个要考虑的事情是提取一个类来表示<代码>规则<代码>。 例如:

class Foo
  def initialize(a)
    @a = a
  end

  def apply?(examples)
    size_rule_applies?(examples) ? 1 : 2
  end

  private

  def size_rule_applies?(examples)
    SizeRule.new(@a, examples).apply?
  end

  class SizeRule
    def initialize(a, examples)
      @a        = a
      @examples = examples
    end

    def apply?
      @examples.size > @a
    end
  end
end

我不会将
examples
作为
Foo
类的一个实例变量,因为在调用该对象的过程中,它有可能会在内存中持续存在。我见过这样的错误。

如果
示例
动态更改,则不能将其设置为实例变量。您可能需要为每个
示例
实例化
Foo
,或者您将最终得到可变
Foo
,其中
示例
本身正在更改,这也不好

你的代码看起来不错。唯一让我担心的是,一种方法依赖于另一种方法。这通常没什么大不了的,但在我看来这会更好:

  def apply?(examples)
    foo_1(examples) && foo_2(examples)
  end

另一个选项是使用块:

class Foo
  def initialize(a)
    @a = a
  end

  def apply?(examples)
    foo_1 { examples }
  end

  private

  def foo_1
    v = foo_2 { yield.size }
    v ? 1 : 2
  end

  def foo_2
    yield > @a
  end
end

由于类
Foo
目前除了计算
.apply?(示例)
之外没有其他功能,因此我建议将示例添加到初始值设定项中,并将其作为实例变量。这更简单、更有效、更明显

class Foo
  def initialize(a, examples)
   @a = a
   @examples = examples
  end

  def apply?
    foo_1
  end

  private

  def foo_1
    foo_2 ? 1 : 2
  end

  def foo_2
    @examples.size > @a
  end
end

查询对象违反“告诉-不要问”,返回类型表示您没有使用“Duck-Typing”。我建议从纯OO的角度重新考虑实现,以帮助将来避免麻烦。关于实际需求的信息太少,并且没有实际的示例用例。通常情况下,对于建设性的讨论来说,缺少这些信息是很好的,但是因为这都是关于好的设计模式的,所以确实需要更多的信息。否则,将示例添加到初始值设定项并为每个查询实例化类可能是一个合理的解决方案。既然要为每个查询创建Sizerole类的新实例,为什么不将
examples
添加到
Foo
的初始值设定项中呢?您可以有一个
Foo
的实例,并始终设置
a
,但是,请多次使用此对象,每次使用不同的
示例请求
apply?
。至少,我是这样理解这里的设置的。