JavaScript包含许多功能

时间:2018-04-26 11:24:08

标签: javascript

我有4个函数一个接一个地调用:

var res = f1(f2(f3(f4(f5(a, b), 1, 2, true))))

有没有更简洁的方法来重构这个。 我希望能够看到参数,代码应该是最小的。

我可以这样做:

let s1 = f5(a, b);
let s2 = f4(s1, 1, 2, true);
let res = f1(f2(f3(s2)))

但我不想引入其他变量。

我可以做到简短易读/重构。

由于

5 个答案:

答案 0 :(得分:2)

var res = f1(f2(f3(f4(f5(a, b), 1, 2, true))))
  

有没有更简洁的方法来重构这个。我希望能够看到参数,代码应该是最小的。

这对我来说似乎很小。

因为f1,f2和f3只有结果作为参数,所以可以将它们合并为一个函数f123。

但我不知道这对你作为开发者有什么帮助。

5个函数调用不是 可怕。

  

我可以这样做:

let s1 = f5(a, b);
let s2 = f4(s1, 1, 2, true);
let res = f1(f2(f3(s2)))
  

但我不想引入其他变量。

我非常喜欢使用额外的中间变量的方式。 这个使代码易于为另一位开发人员阅读(包括你自己2周后)

我不明白为什么这对你来说是一个问题。你能详细说明吗?

另一种可能性是使用一些流水线机械。这将绝对不是最小代码,但这可以通过使操作的逻辑顺序更明显来使代码更清晰。

例如:Observable(RxJS)

Observable.of(f5(a,b))
          .map(r5 => f4(r5, 1, 2, true))
          .map(r4 => f3(r4))
          .map(r3 => f2(r3))
          .map(r2 => f1(r2))
          .subscribe(r => console.log(r))

但从某种意义上说,你会有一些"中间变量"由lambda表达式的参数表示。

答案 1 :(得分:1)

// consider this function as small library or hidden part.
// it's composition/high-order function
var f = (func, ...rest) => {
    if(typeof func === "function") {
        if(this.__res)
            this.__res = func(this.__res, ...rest)
        else
            this.__res = func(...rest)
        return f
    } else {
        var result = this.__res
        this.__res = undefined
        return result
    }
}

// the real part you want is here
var res = f(f5, a, b)(f4, 1,2,true)(f3)(f2)(f1)()

我知道你不想引入另一个变量。 但是当你将函数f视为库或模块/包的隐藏部分时,f(f5,a,b)(f4,1,2,true)(f3)(f2)(f1)()更具可读性和清洁性,不是吗?

答案 2 :(得分:0)

var res = f1(
    f2(
        f3(
            f4(
                f5(a, b), 
                1, 
                2, 
                true
            )
        )
    )
);

或只是将结果保存在变量中......

var result_f5 = f5(a, b);
var result_f4 = f4(result_f5, 1, 2, true);
var result_f3 = f3(result_f4);
var result_f2 = f2(result_f3);
var result_f1 = f1(result_f2);

我更喜欢第二种方式...... 没有其他更快的"或"清洁"方式

答案 3 :(得分:0)

您可以从右侧缩小,但需要嵌套函数npm并以f4作为起始值。

f5

答案 4 :(得分:0)

恕我直言,最可读和最简洁的方法是添加另一个函数,使这个函数调用序列。即:

function f0 (a, b, c, d, e) { return f1(f2(f3(f4(f5(a, b), c, d, e)))); }

然后简单地致电:

var res = f0(a, b, 1, 2, true);
相关问题