【问题标题】:Pattern for commonly used Underscore.js iteratees常用 Underscore.js 迭代的模式
【发布时间】:2016-02-24 15:42:51
【问题描述】:

我正在使用Underscore.jsUnderscore-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


【解决方案1】:

经过大量搜索,阅读上述 cmets,缺乏响应,我很清楚答案是“否”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2011-01-07
    • 2012-02-11
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多