Соответствует ли следующий шаблон программирования Ramda / функции соглашениям / рекомендациям? - PullRequest
1 голос
/ 06 марта 2019

Оригинал

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 соответствует соглашениям / рекомендациям?

1 Ответ

4 голосов
/ 06 марта 2019

Лично я думаю, что ваша оригинальная функция в порядке. Поскольку вы используете 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']));
...