我有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)))
但我不想引入其他变量。
我可以做到简短易读/重构。
由于
答案 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);