我有一些课程会根据某些条件做点什么。条件作为参数发送到某些方法。我的问题与ruby编码风格有关:
条件是作为lambdas / blocks发送的,还是作为从条件类继承的某些对象发送的?
在OOP方面效率更高?
谢谢!
答案 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样式接口的做法。
无论如何,您所做的事情被称为控制和策略模式的反转,请阅读相关信息以获取更多信息。关键是让代码用户决定代码最终行为的(好)决定,如实现配置参数或其他类型的分支。