对象方法和统计 - 最好的面向对象设计方法问题

时间:2010-09-08 20:12:11

标签: oop

我需要编写一些实例方法,就像这样(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

哪个代码更好?为什么?

3 个答案:

答案 0 :(得分:1)

出于几个原因,首选版本应该是首选版本。首先,它使测试更容易,因为每种方法都独立于其他状态。要测试do_bar方法,只需创建其包含类的实例,并使用各种参数调用该方法。如果选择第二个版本的代码,则必须确保在调用方法之前对象已设置了所有正确的实例变量。这将测试代码与对象紧密结合在一起,导致测试用例破裂,或者更糟糕的是,测试用例不再通过,但仍然可以,因为它们尚未更新以匹配对象现在的工作方式。

首选版本代码的第二个原因是它更具功能性,便于重用。假设另一个模块或lambda函数比当前函数更好地实现do_bar。它不会被编码为假设某个父类具有某个命名实例变量。为了可重用,它将期望任何变量作为参数传递。

功能方法是更好的方法......即使在面向对象的语言中也是如此。

答案 1 :(得分:1)

param是否替换了对象状态的一部分?


如果 param没有改变对象状态那么为方便起见,在这些方法之间引入非显而易见的耦合是错误的。

如果 param正在改变对象的状态那么公共api改变状态仍然是不好的做法 - 更好的方法是让一个私有方法负责检查和改变国家

如果 param是直接设置对象的状态那么我会在这里更改实例变量,但只有在检查新状态不一致后才

答案 2 :(得分:-1)

如果您不需要param方法之外的foo_bar,则第一个版本会更好。更明显的是传递什么信息,你保持它更友好的线程。

我也同意上面评论中的Mladen:不要在不属于那里的对象状态中添加内容。