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?
。至少,我是这样理解这里的设置的。