javascript - 以下 Ramda/函数编程模式是否遵循约定/最佳实践?
问题描述
原来的
export const isTimeStrValid = str => {
return str.length >= 4 && moment(str, ['H:mm', 'HH:mm'], true).isValid();
};
拉姆达
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 版本是否遵循约定/最佳实践?
解决方案
我个人认为您的原始功能很好。由于您使用的是 ES6,因此您可以摆脱(命令式)return
语句:
export const isTimeStrValid = str =>
str.length >= 4 && moment(str, ['H:mm', 'HH:mm'], true).isValid();
从最佳实践的角度来看,你的“功能”版本是否合适很难说,因为这主要是一个主观辩论。
我唯一能说的是,无点风格会导致冗长,但您可以通过将事物分成更小的块来缓解这种情况:
例如,这对您来说会更好吗?
const isTimeStrValid = R.both(isValidString, isValidMoment);
哪里isValidString
和isValidMoment
是可重用的功能:
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']));
推荐阅读
- apache-spark - 加入已经在键子集中分区的 PySpark SQL 数据帧
- trace32 - 劳特巴赫脚本:检查函数名称和参数数据类型
- python - Python创建一个只读包装类而不修改包装类
- shell - Jenkins 执行选项卡
- javascript - 使用 Javascript 获取和使用 Python 请求获取之间的关系
- java - 通过从 JavaScript fetch API 接收 Spring MVC ModelAndView 进行重定向
- c++ - c++ 在 Visual Studio 2019 游戏窗口中显示黑屏 Windows 10
- autocomplete - CKEditor insertHtml outputTemplate
- node.js - 如何在 TypeScript 中导出库?
- typescript - 什么是类中的“at-syntax”