我需要编写一些实例方法,就像这样(ruby中的代码):
def foo_bar(param)
foo(param)
if some_condition
do_bar(param)
else
do_baz(param)
end
end
方法foo_bar是一个公共API。
但我认为,这里的param变量出现的次数太多了。也许最好创建一个私有实例变量并在foo,do_bar和do_baz方法中使用它?像这里:( @param
是ruby中的实例变量,可以随时初始化)
def foo_bar(param)
@param = param
foo
if some_condition
do_bar
else
do_baz
end
end
哪个代码更好?为什么?
答案 0 :(得分:1)
出于几个原因,首选版本应该是首选版本。首先,它使测试更容易,因为每种方法都独立于其他状态。要测试do_bar
方法,只需创建其包含类的实例,并使用各种参数调用该方法。如果选择第二个版本的代码,则必须确保在调用方法之前对象已设置了所有正确的实例变量。这将测试代码与对象紧密结合在一起,导致测试用例破裂,或者更糟糕的是,测试用例不再通过,但仍然可以,因为它们尚未更新以匹配对象现在的工作方式。
首选版本代码的第二个原因是它更具功能性,便于重用。假设另一个模块或lambda函数比当前函数更好地实现do_bar
。它不会被编码为假设某个父类具有某个命名实例变量。为了可重用,它将期望任何变量作为参数传递。
功能方法是更好的方法......即使在面向对象的语言中也是如此。
答案 1 :(得分:1)
如果 param没有改变对象状态那么为方便起见,在这些方法之间引入非显而易见的耦合是错误的。
如果 param正在改变对象的状态那么公共api改变状态仍然是不好的做法 - 更好的方法是让一个私有方法负责检查和改变国家。
如果 param是直接设置对象的状态那么我会在这里更改实例变量,但只有在检查新状态不一致后才
答案 2 :(得分:-1)
如果您不需要param
方法之外的foo_bar
,则第一个版本会更好。更明显的是传递什么信息,你保持它更友好的线程。
我也同意上面评论中的Mladen:不要在不属于那里的对象状态中添加内容。