以下Ramda /函数编程模式是否遵循约定/最佳实践?

问题描述 投票:1回答:1

原版的

export const isTimeStrValid = str => {
  return str.length >= 4 && moment(str, ['H:mm', 'HH:mm'], true).isValid();
};

Ramda

export const isTimeStrValid = R.allPass([
  R.pipe(R.length, R.gte(R.__, 4)),
  R.pipe(
    s => moment(s, ['H:mm', 'HH:mm'], true),
    R.invoker(0, 'isValid'),
  ),
]);

Ramda /函数式编程版本感觉很冗长但我无法弄清楚如何使它更优雅。目前看来,原始/命令式版本似乎更容易阅读/理解。我的Ramda版本是否遵循惯例/最佳实践?

javascript functional-programming ramda.js
1个回答
4
投票

我个人认为你原来的功能很好。由于你使用的是ES6,你可以摆脱(命令式)return声明:

export const isTimeStrValid = str =>
  str.length >= 4 && moment(str, ['H:mm', 'HH:mm'], true).isValid();

从最佳实践的角度看你的“功能”版本是否合适很难说,因为这主要是一个主观的争论。

我唯一可以说的是,无点样式可以导致冗长,但是你可以通过将事物分成更小的块来缓解这种情况:

例如,这会更好地为您阅读吗?

const isTimeStrValid = R.both(isValidString, isValidMoment);

isValidStringisValidMoment可重复使用的功能:

const isValidString = R.compose(R.lte(4), R.length);
const toMoment = R.curry((strict, formats, datestr) => moment(datestr, formats, strict));
const isValidMoment = R.compose(R.invoker(0, 'isValid'), toMoment(true, ['H:mm', 'HH:mm']));
© www.soinside.com 2019 - 2024. All rights reserved.