Ruby风格的问题:块还是继承?

时间:2009-01-13 22:21:23

标签: ruby oop coding-style

我有一些课程会根据某些条件做点什么。条件作为参数发送到某些方法。我的问题与ruby编码风格有关:

  • 条件是作为lambdas / blocks发送的,还是作为从条件类继承的某些对象发送的?

  • 在OOP方面效率更高?

谢谢!

4 个答案:

答案 0 :(得分:6)

从执行时间的角度来看,我不知道哪个更有效,但从用户界面的角度来看,块更有效。使用您的方法的人只是将条件写入块中,而不是必须定义一个全新的类,创建一个实例,并将其传递给您的方法。

答案 1 :(得分:4)

这一切都可以忽略不计,这取决于你的实际操作以及是否可以缓存条件对象或过程,但一般来说块是Ruby方式,它们比对象创建更快。

这是一个无用的基准:

require 'benchmark'

# Useless parent class
class Condition; end

# Useless inheritance.  Duck typing FTW.
class AddCondition < Condition  
  def call
    1 + 1
  end
end

def with_object(condition)
  condition.call
end

def with_block
  yield
end

n = 100000
Benchmark.bm(10) do |x|
  x.report("object:") do
    n.times do; with_object(AddCondition.new); end
  end
  x.report("block:") do
    n.times do; with_block { 1 + 1 };          end
  end
end

结果:

                user     system      total        real
object:     0.090000   0.000000   0.090000 (  0.087227)
block:      0.060000   0.000000   0.060000 (  0.063736)

答案 2 :(得分:3)

Lambdas更像是Ruby的方式 - 除此之外,为什么要为一个简单的lambda做的事情定义一个完整的大类呢?或者,您可以像Rails一样传递条件。

答案 3 :(得分:1)

在这种情况下我会使用继承的唯一情况是,如果条件本身使用许多公共代码,那么可以在超类中实现完全(不需要覆盖子类中的任何内容)但是,在Ruby中不常使用继承java样式接口的做法。

无论如何,您所做的事情被称为控制和策略模式的反转,请阅读相关信息以获取更多信息。关键是让代码用户决定代码最终行为的(好)决定,如实现配置参数或其他类型的分支。

相关问题