Является ли Ramda ifElse эффективным шаблоном, если он абстрагирует троичную операцию - PullRequest
0 голосов
/ 19 сентября 2018

Рискованный вопрос, подлежащий суждению.Я работаю над проектом с Ramda.js.И я вижу много ifElse звонков по всему коду.

const getEvent = R.ifElse(
  fireable,
  R.always(sendAnalyticsEvent),
  R.always(R.always(undefined))
);

Действительно ли это стоит усилий, чтобы обернуть логику в функциональное условие, подобное этому?Есть ли выгода?

Если в конечном итоге Рамда просто абстрагирует троичную операцию, и мы возвращаем неопределенное при ложном совпадении.

Рамдас ifElse

var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) {
  return curryN(Math.max(condition.length, onTrue.length, onFalse.length),
    function _ifElse() {
      return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
    }
  );
});
export default ifElse;

Это похоже на anitpattern вмир FP, всегда возвращающий undefined или в некоторых случаях null

R.ifElse(hasUrl, promptToShare, R.always(null))

Независимо от сомнительного возврата undefined, не будет ли использование троичных операторов более идиоматичным для сообщества javascript?

hasUrl(urlObject) ? promptToShare() : null

Это кажется мне более кратким и разборчивым, я хочу провести рефакторинг.Но это может быть связано с моей наивностью мира FP.

1 Ответ

0 голосов
/ 20 сентября 2018

Несколько баллов (отказ от ответственности: я автор Рамды):

  • Слишком часто вы правы.Бессмысленный код чрезмерно используется, когда новые пользователи используют FP в Javascript.Я обычно полагаю, что это полезно только тогда, когда это улучшает читабельность.

  • Вызов ifElse не эквивалентен условному выражению Javascript (троичное). Он может быть эквивалентен лямбда-функции, котораявозвращает значение троичного, однако.То есть пример будет больше похож на (urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null.На этом этапе ifElse, по крайней мере, возможно, более читабелен.Это подводит нас к пунктам из комментариев о частичном применении / карринге

  • Я вижу небольшую причину использования ifElse с функциями, которые имеют разные подписи.То есть, если promptToShare не принимает аргументов, то, вероятно, он не относится к вызову ifElse.

  • Эта функция getEvent выглядит довольно странно.Учитывая, что оно использует имя типа sendAnalyticsEvent, я предполагаю, что оно создает некоторый побочный эффект.А другая ветка не работает.Хотя команде Ramda на самом деле все равно, как вы используете библиотеку, мы не предполагаем, что это будет функция, созданная пользователями.

  • Я видел другие странные вызовы ifElse передача идентификатора для одной из функций ветвления.Предположительно их следует заменить на when или unless, что, безусловно, будет более семантическим.

Так что я согласен, что вашему примеру вообще не нужен ifElse.Но у ifElse и его пэров when и unless есть свои места.

...