【发布时间】:2016-02-24 15:42:51
【问题描述】:
我正在使用Underscore.js 和Underscore-contrib 开发财务分析工具。
我经常重复低级算术原语。例如,一个 Array 的简单求和:
code-a.js:
arr_a = [20, 15, 7];
arr_b = [19, 19, 19];
_.reduce(arr_a, function(memo, x) { return memo + x; }, 0);
# => 42
_.reduce(arr_b, function(memo, x) { return memo + x; }, 0);
# => 57
我想过创建一个命名函数来消除迭代定义的重复:
code-b.js:
function sum(memo, x) {
return memo + x;
}
arr_a = [20, 15, 7];
arr_b = [19, 19, 19];
_.reduce(arr_a, sum, 0);
# => 42
_.reduce(arr_b, sum, 0);
# => 57
然后继续包装 reduce 调用以进一步干燥:
code-c.js:
function sum(memo, x) {
return memo + x;
}
function accumulate(vector) {
_.reduce(vector, sum, 0);
}
arr_a = [20, 15, 7];
arr_b = [19, 19, 19];
accumulate(arr_a);
# => 42
accumulate(arr_b);
# => 57
对我来说,这闻起来像是要去mixin:
lib-a.js:
_.mixin({
accumulate: function (vector) {
_.reduce(vector, function(memo, x) {
return memo + x;
}, 0);
}
});
code-d.js:
arr_a = [20, 15, 7];
arr_b = [19, 19, 19];
_.accumulate(arr_a);
# => 42
_.accumulate(arr_b);
# => 57
使用 mixin 可以很好地完成工作。我的问题是:是否有任何 other 模式(特定于 Underscore.js)可以在不使用 mixins 的情况下重用 iteratees?如果那是“the " [only] 模式,我只是问有没有其他的策略来解决回调复用的问题。
例如,code-b.js 演示了一种可能的替代方案 - 只需将 iteratee 创建为命名函数(可能从模块中导出以避免需要匈牙利式命名约定)。
【问题讨论】:
-
你应该将
sum函数称为“add”,将accumulate函数称为“sum”。 -
我认为没有其他模式。
-
您还可以探索 Lodash(内置 _.sum function)
-
@sfletche 这只是一个琐碎的例子(此外,在宏伟的计划中,加法并不是一个很难重新发明的轮子;-))
-
@Bergi 可能不会,但在你问之前你永远不会知道
标签: javascript design-patterns callback underscore.js code-reuse