您将如何重写此multi-arg函数,最终指向自由样式?

Cat*_*ima 0 javascript functional-programming ramda.js

我是Ramda和函数式编程的新手,我想知道有人将如何改进下面的代码或将其转换为自由点样式

const doc = {
  passwordRecovery: {
    requested: true,
    expiresAt: new Date(Date.now() + 1000).toISOString(),
    code: 'abc'
  }
}

const req = {
  password: '123',
  passwordRecovery: {
    code: 'abc'
  }
}

const pathCode = R.path(['passwordRecovery', 'code'])
const isValidCode = R.curry(
    (doc, req) => R.all(
        R.hasPath(['passwordRecovery', 'code'], req),
        R.pathEq(['passwordRecovery', 'requested'], true, doc),
        R.compose(R.complement(R.isNil), pathCode)(doc),
        R.equals(pathCode(req), pathCode(doc)),
        R.pipe(
            R.path(['passwordRecovery', 'expiresAt']),
            Date.parse,
            R.gte(R.__, Date.now()),
        )(doc)
    )
);

isValidCode(doc)(req)
Run Code Online (Sandbox Code Playgroud)

cus*_*der 5

几个建议:

避免混乱

不熟悉Curry的人经常说同样的话:为什么add(1)(2)在您可以做的时候add(1, 2)呢?他们是对的。这个例子根本不公平。

如果您的团队只是想熟悉函数式编程,请不要不必要地使他们感到困惑。如果您可以一次性提供所有参数,请执行以下操作:

isValidCode(doc, req); // not isValidCode(doc)(req);
Run Code Online (Sandbox Code Playgroud)

不要为了使用Ramda而使用Ramda

这与:R.equals(pathCode(req), pathCode(doc))相同pathCode(req) === pathCode(doc)

如果您确实想使用Ramda,请考虑eqBy

eqBy(pathCode, req, code);
Run Code Online (Sandbox Code Playgroud)

没有积分不是唯一的方法

当然,这是一种有趣的编写函数的方式,但这并不是目标。假设您需要检查a等于'foo'b等于'bar'

这是没有意义的功能:

const fn = useWith(and, [equals('foo'), equals('bar')]);
Run Code Online (Sandbox Code Playgroud)

有什么比这更好的了:

const fn = (a, b) => a === 'foo' && b === 'bar';
Run Code Online (Sandbox Code Playgroud)

是否all正确调用?

根据文档,all获取一个函数和一个列表:

all(x => x === 42)([41, 42, 43]);
Run Code Online (Sandbox Code Playgroud)

除非我弄错了,否则您所做的就是all使用每个函数调用的结果进行调用。例如

all(true, false, true, ...);
Run Code Online (Sandbox Code Playgroud)

避免__占位符

gte(__, Date.now()) 可以更改为 flip(gte)(Date.now())

始终如一

在一种情况下,您可以将路径设置为undefined

// true even for `{passwordRecovery: {code: undefined}}`
hasPath(['passwordRecovery', 'code'], req);
Run Code Online (Sandbox Code Playgroud)

而在另一种情况下,您不会:

compose(R.complement(R.isNil), pathCode)(doc)
Run Code Online (Sandbox Code Playgroud)

保持一致将允许:

const notNil = complement(isNil);
both(pathSatisfies(notNil, pathCode), req, doc)
Run Code Online (Sandbox Code Playgroud)