Объединение функций для большей функциональности с помощью JavaScript - PullRequest
0 голосов
/ 25 мая 2018

У меня есть некоторый (псевдо) код, который выглядит следующим образом

const { search, hash } = window.location // get search / hash from url
  const tokenParts = queryParams(search || hash) // create an object
  const { id_token, access_token } = tokenParts // extract from object
  const isSessionValid = validateSession(id_token) // check exp time etc and return true / false

  if (isSessionValid) {
    store('id_token', id_token)
    store('access_token', access_token)

    window.history.replaceState(null, null, window.location.pathname)
  }

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

Из того, что я прочитал, функции должны действительно«делай одно» - а не эти массивные, сложные биты, которые может быть трудно проверить.

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

Я думаю, мне нужно что-то вроде

const sessionisValid = validateSession(window.location)

validateSession = ({search, hash}) => (queryParams(search || hash))=> hasTokenExp({id_token})

Но я не понимаю ...

  1. Если этокак должно работать программирование / составление функций
  2. Это лучший подход
  3. Если я просто слишком усложняю вещи

1 Ответ

0 голосов
/ 25 мая 2018

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

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

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

И поскольку все эти функции чистые и ваши переменные неизменны, ваш код очень просто реорганизовать из

const { search, hash } = window.location // get search / hash from url
const { id_token, access_token } = queryParams(search || hash)
const isSessionValid = validateSession(id_token) // check exp time etc

if (isSessionValid) {
    store('id_token', id_token)
    store('access_token', access_token)

    window.history.replaceState(null, null, window.location.pathname)
}

до

function getSession({search, hash}) {
    const { id_token, access_token } = queryParams(search || hash)
    return {
        id_token,
        access_token,
        isSessionValid: validateSession(id_token)
    };
}

const { id_token, access_token, isSessionValid } = getSession(window.location);
if (isSessionValid) {
    store('id_token', id_token)
    store('access_token', access_token)

    window.history.replaceState(null, null, window.location.pathname)
}

, но если вы не можете использовать getSession в нескольких местах или вам нужен этот уровень абстракции для организации кода, рефакторинг не нужен.

как можноэто будет рефакторинг для использования композиции функций?

Это не может на самом деле.Композиция функций работает только тогда, когда результат одной функции передается в другую функцию и нигде больше.Но в вашем коде access_token и id_token используются в нескольких местах.Хотя это можно выразить в pointfree style , оно сложное, медленное и слишком абстрактное.Переменные здесь намного проще в использовании.

Я часто вижу этот шаблон в кодовой базе, над которой я работаю

Что такое шаблон?Всякий раз, когда вы видите дублированный код, вы можете абстрагироваться от общих частей.Но вам нужно оценить, сколько общих частей и сколько отдельных частей есть в блоках кода.Хотя всегда возможно, часто это того не стоит.

...