Ruby方法可以接受代码块作为参数是一种非常灵活的用法,也是一种非常优秀的设计思路。假设有如下图1所示的3个方法:
图1
从图1中可以看出,方法A、方法B和方法C大量的代码块都是完全相同的。那么是不是需要定义3个方法?是不是还有更好的做法?
在软件开发领域,有一条重要的DRY规则:不要重复。在图1的3个方法中,可发现它们包含了大量的重复代码,为此,将上面3个方法合并成一个方法,而3个方法中特定的代码块则作为参数传入,这种做法如图2所示。
图2
从图2中可以看出,通过使用代码块作为参数,可用一个方法来代替多个方法,从而提供更好的代码复用,保证软件具有更好的可维护性。
示例代码:
@testdata=Array.new
@testdata<<”孙悟空”
@testdata<<”猪八戒”
def make(thing)
puts “准备工作”
yield(thing)
puts “收工动作”
end
def pp(key1,key2)
puts key1+”和”+key2
end
make(@testdata){|a|
pp(*a)
}
make(”猪八戒”){|a|
puts a
}
make(”唐僧”){|a|
puts a
}
运行结果:
准备工作
孙悟空和猪八戒
收工动作
准备工作
猪八戒
收工动作
准备工作
唐僧
收工动作