ООП и функциональное программирование: разница - itgirlschool/wiki GitHub Wiki

Meme about OOP

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

Среди массы парадигм программирования сейчас выделяются два самых популярных стиля – функциональное программирование (ФП) и объектно-ориентированное программирование (ООП). И JavaScript поддерживает оба.

Объектно-ориентированное программирование

OOP scheme

ООП базируется на понятии «объекты». Это структуры данных, которые содержат поля данных – известные в JavaScript как «свойства» – и процедуры – известные как «методы».

Некоторые из встроенных объектов JavaScript используют эту парадигму, включая Math (для методов random, max и sin), JSON (для анализа данных JSON) и примитивные типы данных, такие как String, Array, Number и Boolean.

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

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

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

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

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

const num = {
  val: 1
}; 
const add5 = () => num.val += 5; 
const multiply5 = () => num.val *= 5;

Если вызовем сначала add5, а затем multiply5, результат будет 30. Но если вызовем функции наоборот и запишем результат, то получим другое: 10.

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

const num = {
  val: 1
};
const add5 = () => Object.assign({}, num, {val: num.val + 5}); 
const multiply5 = () => Object.assign({}, num, {val: num.val * 5});

Теперь значение num.val остаётся равным 1, и независимо от контекста add5(num) и multiply5(num) будут давать один и тот же результат.

Comparison