Веселье с функциональным программированием!

Что вы должны знать?

  • JavaScript
  • Функции в JS
  • Фон кодирования
  • Базовое логическое мышление (самое главное)

Что такое функциональное программирование?

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

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

Выполнение

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

["INNOVATION","DISTINGUISHES","BETWEEN","LEADER","AND","FOLLOWER"]

Поэтому обычно мы пишем функцию хардкорным способом и пишем реализацию, как показано ниже:

let str = 'Innovation distinguishes between a leader and a follower.!!'

let prepareString = function () {
  let str1 = str.trim();
  let str2 = str1.replace(/[?.,!]/g, '')
  let str3 = str2.toUpperCase();
  let arr = str3.split(" ");
  for(let i = 0; i < arr.length; i++) {
     if(arr[i] === 'A' || arr[i] === 'AN' || arr[i] === 'THE') {
       arr.slice(i,1);
     }
  } 
  return arr;
}

Если вы обратите внимание на приведенное выше решение, вы увидите, что мы написали реализацию таким образом, что она фактически мутирует исходное состояние данных, которое является строкой.

str = "Innovation distinguishes between a leader and a follower.!!"

чего мы не хотим, чтобы произошло. Итак, вопрос

  • Можем ли мы сделать наш код более читабельным?
  • Можем ли мы разделить наш код на более мелкие функции? И ответ - Да.

Давайте функционально решим указанную выше задачу.

const str = 'Innovation distinguishes between a leader and a follower.!!'

const trimString = str => str.replace(/^\s*|\s*$/g, '');

const noPunction = str => str.replace(/[?.,!]/g, '');

const capitalizeStr = str => str.toUpperCase();

const splitStr = str => str.split(" ");

const noArticles = str => (str !== 'A' && str !== 'AN' && str !== 'THE');

const filterArticles = arr => arr.filter(noArticles);

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

console.log(filterArticles(splitStr(capitalizeStr(noPunction(trimString(str))))));

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

const compose = (...fns) => (x) => fns.reduce((value, currentFunction) => currentFunction(value), x);
const prepareString = compose(trimString, noPunction, capitalizeStr, splitStr, filterArticles);

Теперь, если вы попытаетесь сделать

console.log(prepareString(str));

вы получаете вывод ниже

["INNOVATION","DISTINGUISHES","BETWEEN","LEADER","AND","FOLLOWER"]

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

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

Надеюсь, вам, ребята, понравилась статья.

Дайте мне знать, что вы думаете о функциональном программировании в целом. Выше приведен только один пример, я придумаю еще несколько в следующих постах.

Счастливого обучения!!