f (вторник)

Введение

devSchacht

Понятие функции
(математическое)

- правило f, по которому каждому элементу x множества X ставится в зависимость единственный элемент y множества Y

Или проще...

- закон отображения множества X на множество Y

И вы туда же?

Да..!

Сейчас разберемся

Зависимости

y = f (x)

y = f (x)

S = V·t

S = 80·t

y = f (x)

S = f (t)

А о программировании будет?

Будет!

(куда же без него)
const multiplyByFive = (x) => 5 * x;

const y = multiplyByFive(4);

// y === 20;
  • y - зависимая переменная, наша функция
  • x - независимая переменная или аргумент
  • multiply - наша f - набор действий, которые нужно произвести над переданным x для получения y

Функция
в математическом понимании:

  1. Получает переменную
  2. Совершает над ней действия
  3. Возвращает переменную

И ничего больше!

(просто и понятно, к этому стоит стремиться и в программировании)

Понятие функции
(программирование)

- фрагмент программного кода, к которому можно обратиться из другого места программы

Чистая функция

  • принимает аргументы
  • при одних и тех же аргументах производит одинаковый результат
  • основывается только на внутреннем состоянии и не изменяет внешнее
  • не производит побочных эффектов
  • не может вызывать нечистые функции
Чистая функция
const multiplyByFive = (x) => 5 * x;

const y = multiplyByFive(4);

// y === 20;
Нечистая функция
const multiplyByFive = () => x * 5;

const x = 4;
const y = multiplyByFive();

// y === 20;
Нечистая функция
let y;

const multiplyByFive = () => {
	y = 5 * x;
};

const x = 4;
multiplyByFive();

// y === 20;

Математическая функция != JavaScript функция

Мы же хотим

Математическая функция == JavaScript функция

Следовательно нам нужно

JavaScript функция == Чистая функция

Побочные эффекты

const multiplyByFive = () => {
	y = x * 5;
};

const x = 4;
multiplyByFive();

// y === 20;

Состояние

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

С состоянием

var number = 1;

function increment() {
  return number++;
}

// глобальная переменная изменяется: number = 2
increment();

Без состояния

var number = 1;

function increment(n) {
  return n + 1;
}

// глобальная переменная НЕ изменяется: возвращает 2
increment(number);

Неизменяемость

- ключевая особенность функционального программирования

Неизменяемый - значение объекта не может быть изменено после создания

Изменяемый - значение объекта может быть изменено после создания

JavaScript — язык с сильной изменяемостью и состоящий из множества парадигм

Плюсы неизменяемости

  • код проще понимать
  • персистентность (существование в течении длительного времени)
  • возможность хранения более старых версий структур данных

Минус неизменяемости

- многие алгоритмы и операции не могут быть эффективно реализованы

Декларативность

Императивный код - как достичь

Декларативный код - что достичь

Императивный код

function incrementArray(arr) {
	let resultArr = [];
	for (let i = 0; i < arr.length; i++) {
		resultArr.push(arr[i] + 1);
	}
	return resultArr;
}

Декларативный код

function incrementArray(arr) {
	return arr.map(item => item + 1);
}
const multiplyByFive = (x) => 5 * x;

const y = multiplyByFive(4);

// y === 20;

Функции высшего порядка

- функция, принимающая другую функцию в качестве аргумента или возвращающая функцию в результате
const double = function(x) {
	return x * 2;
}

const timesTwo = double;

timesTwo(4); // результат: возвращает 8
function sayHi() {
	alert('Hi!');
}

function greet(greeting) {
	greeting();
}
greet(sayHi); // "Hi!"
function whenMeetingJohn() {
	return function() {
		alert('Hi!');
	}
}

var atLunchToday = whenMeetingJohn();

atLunchToday(); // "Hi!"

Функциональное программирование

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

Минусы

  • Требует много памяти
  • Широко не распространен

Плюсы

  • Отсутствие багов
  • Переиспользование функций
  • Паралельное исполнение
  • Производительность
  • Инкапсуляция логики в чистых функциях
  • Модульность
  • Поддержка и понимание
  • Тестируемость

Помните,

каждая парадигма обладает своими плюсами и минусами, меняющимися в зависимости от задачи

Но...

Использованная литература
и дополнительная информация

Справочник современных концепций JavaScript: часть 1 Функция, производная, графики Mostly adequate guide to FP Higher Order Functions (Composing Software) Why Learn Functional Programming in JavaScript? (Composing Software) Functional JavaScript Compare Functional Programming, Imperative Programming and Object Oriented Programming

f (вторник)


Роман Пономарев Вадим Яловенко
GitHub Medium