我一直在阅读Ruby Refactoring一书(Fields,Harvie,Fowler)。他们提到了Extract Surrounding Method操作,如果你有中间部分彼此不同的方法,它可以用来避免重复。
def number_of_descendants_named(name)
count_descendants_matchin { |descendant| descendant.name == name }
end
def number_of_living_descendants
count_descendants_matching { |descendant| descendant.alive? }
end
def count_descendants_mathing(&block)
children.inject(0) do |count, child|
count += 1 if yield child
count + child.count_descendants_matching(&block)
end
end
我相信你明白了。你会如何与Javascript类似?
答案 0 :(得分:3)
Javascript也有闭包,所以它非常简单,只需将块转换为匿名函数,代码几乎相同:
var number_of_descendants_named = function(name) {
return count_descendants_matching(function(descendant) {
return descendant.name == name;
});
};
var number_of_living_descendants = function(descendant) {
return count_descendants_matching(function(descendant) {
return descendant.alive();
});
};
var count_descendants_mathing = function(cb) {
// reduce: use underscore or any other functional library
return somelib.reduce(children, 0, function(count, child) {
return count + (cb(child) ? 1 : 0) + child.count_descendants_matching(cb)
});
};
这个函数样式,其中所有东西都是要返回的表达式,在普通的Javascript中非常冗长,但是一些altJS语言(例如Coffeescript)简化了它。