JavaScript包含许多函数

JavaScript包含许多函数,javascript,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))) 但我不想引入其他变量 我能做得简短易读/重构吗 谢谢 或者只是将结果保存在变量中 var result_f5 = f5(a, b); va

我有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)))
但我不想引入其他变量

我能做得简短易读/重构吗

谢谢

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

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);
我更喜欢第二种方式。。。 没有其他“更快”或“更干净”的方法

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

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);
我更喜欢第二种方式。。。 没有其他“更快”或“更干净”的方法

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

这对我来说似乎很小

由于f1、f2和f3只有其结果作为参数,因此可以将它们合并为一个函数f123

但我不认为这对作为开发人员的您有什么帮助

5个函数调用并没有那么可怕


我可以这样做:

let s1 = f5(a, b);
let s2 = f4(s1, 1, 2, true);
let res = f1(f2(f3(s2)))
但我不想引入其他变量

我非常喜欢附加中间变量的方式。这使得代码对于其他开发人员(包括您自己)来说更容易阅读

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


另一种可能性是使用一些管道机械。这绝对不是最简单的代码,但这可以通过使操作的逻辑顺序更加明显而使代码更清晰

例如:可观察(RxJS)

但在某种意义上,您将拥有一些由lambda表达式的参数表示的“中间变量”

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

这对我来说似乎很小

由于f1、f2和f3只有其结果作为参数,因此可以将它们合并为一个函数f123

但我不认为这对作为开发人员的您有什么帮助

5个函数调用并没有那么可怕


我可以这样做:

let s1 = f5(a, b);
let s2 = f4(s1, 1, 2, true);
let res = f1(f2(f3(s2)))
但我不想引入其他变量

我非常喜欢附加中间变量的方式。这使得代码对于其他开发人员(包括您自己)来说更容易阅读

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


另一种可能性是使用一些管道机械。这绝对不是最简单的代码,但这可以通过使操作的逻辑顺序更加明显而使代码更清晰

例如:可观察(RxJS)


但从某种意义上讲,您可能会有一些由lambda表达式的参数表示的“中间变量”。

您可以从右侧减少,但它需要嵌套函数
f4
,以
f5
作为起始值

var x = [f1, f2, f3].reduceRight((x, f) => f(x), f4(f5(a, b), 1, 2, true));
//                                               ^^^^^^^^^^^^^^^^^^^^^^^^   start value
//      ^^^^^^^^^^^^                                                        functions

您可以从右侧减少,但它需要嵌套函数
f4
,以
f5
作为起始值

var x = [f1, f2, f3].reduceRight((x, f) => f(x), f4(f5(a, b), 1, 2, true));
//                                               ^^^^^^^^^^^^^^^^^^^^^^^^   start value
//      ^^^^^^^^^^^^                                                        functions

IMHO最具可读性和简洁性的方法是添加另一个函数,该函数可以进行此函数调用序列。即:

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);

IMHO最具可读性和简洁性的方法是添加另一个函数,该函数可以进行此函数调用序列。即:

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);
我知道你不想引入其他变量。 但是当你把函数F看作是库或模块/包的隐藏部分时,f(f5,a,b)(f4,1,2,true)(f3)(f2)(f1)(f1)更可读和干净,不是吗? 我知道你不想引入其他变量。
但是当你把函数F看作是库或模块/包的隐藏部分时,f(f5,a,b)(f4,1,2,true)(f3)(f2)(f1)(f1)()更可读和干净,不是吗?您可以将函数存储到数组中,然后执行reduce。但我认为这太过分了。管道运营商目前是一个提议,但这在一段时间内不会是一个可行的生产选择。我想说,如果你总是按照这个顺序调用它们,只需定义一个辅助函数:
f_all=(a,b,c,d,e)=>f1(f2(f3(f4(f5(a,b,c,d,e)))
如果你使用了大量的compositionwell,你也可以查看Ramda。这目前还不能编译:结束括号的数量与开始括号的数量不一样。相关:或者,你可以将函数存储到数组中,然后执行reduce。但我认为这太过分了。管道运营商目前是一个提议,但这在一段时间内不会是一个可行的生产选择。我想说,如果你总是按照这个顺序调用它们,只需定义一个辅助函数:
f_all=(a,b,c,d,e)=>f1(f2(f3(f4(f5(a,b,c,d,e)))如果你使用了大量的合成,你也可以查看Ramda。第一个例子只是重新格式化,而不是重构;OP说他们不想引入新的变量。第一个例子是重新格式化,而不是重构;OP说他们不想引入新的变量,就像可观察的版本一样,我认为管道有点问题:让r=pipe(=>f4(a,b),f3,f2,f1)(f5(a,b))@user2693928你完全正确!在这种情况下,管道会更适合我。我喜欢可观察的版本,我认为管道有点问题:让r=Pipe(=>f4(a,b),f3,f2,f1)(f5(a,b))@user2693928你完全正确!管道在这种情况下更适合我它很好,但我将如何调用函数,这5,6个函数是特定的,我想不出一个好的函数名。它将是类似的:GETAGED和FrUATAUTHEMANENETAN和AppEngFutyTyFielActudie:)USSR26939 28如果您对同一数据集进行更改,那么您可能会考虑链接。像这样
var res=data.getAge(18).formatUserName(“%g”).AppendCompany().filterActive(true)。。它是可读的,可定制的