Как написать бессмысленный функционал JS с использованием Ramda - PullRequest
0 голосов
/ 03 июня 2018

У меня есть массив объектов

const myNumbers = [
  {
   top: 10,
   bottom: 5,
   rate: 5
  },
  {
   top: 9,
   bottom: 4,
   rate: 3
  },
];

Я хочу запустить несколько функций, которые делают числа пригодными для использования, прежде чем я что-то с ними сделаю;

const addTen = r.add(10);
const double = r.multiply(2);

И функцию, котораяпринимает числа и выполняет некоторые математические операции:

const process = (top, bottom, rate) => r.multiply(r.subtract(bottom, top), rate)

Итак, моя последняя функция выглядит так:

muNymbers.map(({ top, bottom, rate }) =>
  process(addTen(top), double(bottom), rate)
);

Просто взглянув на этот код, вы увидите, что обе функции уже становятся очень вложенными и не особенноЧисто.Моя настоящая проблема снова немного сложнее, и я изо всех сил пытаюсь понять, как я могу сделать это бессмысленным при выборе разных значений для разных операций.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Если это упражнение по написанию бессмысленного кода, то решение, подобное решению @JeffreyWesterkamp, ​​подойдет.

Однако для производственного кода любое бессмысленное решение будет много менее читабельно, чем эта простая версия:

const process = ({top, bottom, rate}) => ((2 * bottom) - (10 + top)) * rate;

const myNumbers = [
    { top: 10, bottom: 5, rate: 5 },
    { top: 9, bottom: 4, rate: 3 },
];

console.log(R.map(process, myNumbers));
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

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

Не поймите меня неправильно.Я большой поклонник бессмысленного кода, и у Рамды (отказ от ответственности: я один из его авторов) есть несколько полезных инструментов, которые помогут вам написать его.Но Рамда отлично работает с другим кодом.Так что используйте это с умом.


Еще один момент (гм): Рамда предоставляет две довольно необычные функции, useWith и converge, чтобы упростить написание кода без точек.Но converge часто можно заменить на более стандартный lift.Его не всегда можно заменить, поскольку у него есть некоторые функции для работы с переменными функциями, которые lift не предоставляет, но когда вы можете использовать lift, я бы посоветовал вам это сделать.Например, вместо

converge(subtract, [prop('bottom'), prop('top')])

вы могли бы написать

lift(subtract)(prop('bottom'), prop('top'))

Нет стандартной замены для useWith, о которой я знаю.Но я бы по возможности заменил converge на lift.

0 голосов
/ 03 июня 2018

Вот бессмысленный подход.Основные функции, которые вы ищете: pipe, evolve и converge.Я не уверен, что это лучший способ, это просто лучшее, что я мог придумать:

const { add, converge, evolve, map, multiply, pipe, prop, subtract } = R;

const myNumbers = [
    { top: 10, bottom: 5, rate: 5 },
    { top: 9, bottom: 4, rate: 3 },
];

const process = pipe(

    evolve({
        top: add(10),
        bottom: multiply(2),
    }),

    converge(multiply, [

        converge(subtract, [
            prop('bottom'),
            prop('top'),
        ]),

        prop('rate'),
    ]),
);

console.log(map(process, myNumbers));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
...