29
ДЕКЛАРАТИВНО- ФУНКЦИОНАЛЬНЫЙ СТИЛЬ Как инструмент для создания гибких и безопасных приложений

Декларативно функциональный стиль в PHP

Embed Size (px)

Citation preview

Page 1: Декларативно функциональный стиль в PHP

ДЕКЛАРАТИВНО-ФУНКЦИОНАЛЬНЫЙ

СТИЛЬ

Как инструмент для создания гибких и безопасных приложений

Page 2: Декларативно функциональный стиль в PHP

Цели• Писать меньше кода

• Больше бизнес логики (увеличение формализации)

• Более безопасный и качественный код

• Масштабируемость

Page 3: Декларативно функциональный стиль в PHP

Проблема• Типы данных, фильтрация параметров

• Возможные ошибки при работе с данными

• Концентрация на проблеме реализации, а не задаче

Page 4: Декларативно функциональный стиль в PHP

Общие понятия

• Императивное программирование:• Программа состоит из инструкций, которые выполняются шаг за

шагом• Есть глобальное состояние приложения• Количество состояний приложения на таком языке ограничено,

что описывается теорией конечных автоматов• Описывает что и каким образом будет выполнено• Языки:

• PHP, C, Fortran, Basic…

Page 5: Декларативно функциональный стиль в PHP

Общие понятия

• Декларативное программирование: (далее ДП)• Программы на таких языках обычно не имеют глобального

состояния• По сути каждое действие – программа и описывает не

последовательность инструкций, определяющих как надо вычислить, а что нужно вычислить

• Чаще всего являются интерпретируемыми• Примеры:

• Отображение HMTL страницы (описывает что нужно вывести, а не как)• SQL – описывает какие данные нужно извлечь или изменить, а не как

(СУБД сама решает как она это сделает)

Page 6: Декларативно функциональный стиль в PHP

Общие понятия: пример (1)

C

Haskell

Traditional

Recursive

Page 7: Декларативно функциональный стиль в PHP

Общие понятия

• Высокая степень абстракции• Математическая заточенность, прозрачность, простота в

формализации• Всеобщая «ленивость» операций (вычисления происходят в

момент получения данных)• Иммутабельность (отсутствие изменений в исходном контексте)• Языки:

• Haskell, Lisp, Erlang…

Page 8: Декларативно функциональный стиль в PHP

Mutable Immutable

Общие понятия: пример (2)

Page 9: Декларативно функциональный стиль в PHP

Общие понятия: пример (3)

https://gist.github.com/mdsina/b7bd90cbfeb3cabd9eb5

Page 10: Декларативно функциональный стиль в PHP

Общие понятия• Лямбда – некая анонимная функция, которая

полностью встраивается в тело другой функции

• Замыкание – связывает лямбду с окружающим её контекстом, что позволяет использовать переменные, описанные в глобальной области видимости контекста

Page 11: Декларативно функциональный стиль в PHP

Общие понятия: пример (4)

Lambda Closure

Page 12: Декларативно функциональный стиль в PHP

Источники данных• Контейнеры, последовательности

• Потоки, каналы получения данных

• Базы данных

• …

Page 13: Декларативно функциональный стиль в PHP

Данные на ввод и вывод

• Основные принципы в обработке источников данных• Берем данные из источника• Обрабатываем данные• Кладем данные в другой источник

for ($i = 0; $i < $list.getCount(); $i++) {

$list2.push( someFunc($list[$i]) );}

Page 14: Декларативно функциональный стиль в PHP

Разграничение проблем

• Разделение запаковки\распаковки данных из процесса

• Избавиться от необязательных переменных

• Итераторы и алгоритмы: хорошо, но не настолько

transform(getStart($list), getEnd($list), push($list2), someFunc);

Page 15: Декларативно функциональный стиль в PHP

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

• Описывает «что», а не «как»

• Пример: последовательности

$total = accumulate(inc(1),transform(function ($x) { return

$x*$x; }),repeat(10),0

);

Page 16: Декларативно функциональный стиль в PHP

Функторы

• Принимаем функцию, которая выполняет действия над элементами

• Нарастим используя transform

• Наращенная функция выполняется на последовательностиэлементов [1, 2, 3, 4…]

• Возвращает последовательность элементов [1, 4, 9, 16…]

function ($x) { return $x*$x; }

transform(function ($x) { return $x*$x; });

inc(1),transform(function ($x) { return $x*$x; })

Page 17: Декларативно функциональный стиль в PHP

transform(function ($x) { return $x*$x; });

x x*x

square

transform

1, 2, 3 , 4 1, 4, 9, 16

transform(square)

Page 18: Декларативно функциональный стиль в PHP

Ленивость• Бесконечные последовательности [1, 2, 3, 4…]inc(1)

• Не используется «жадно»

• Преобразуем лениво, по требованию

• Работаем с данными, которые не могут поместиться в памяти• Бесконечные последовательности• Большие данные• Запросы БД

Page 19: Декларативно функциональный стиль в PHP

Идея функтора• Функции на типах

• Берем любой тип T и производим наш функтор Functor: TТ.е по сути ковариантный функтор вида из C в категорию D, которое:• Сопоставляет каждому объекту объект

• Функции на функциях• Берем любую функцию f от T1 до T2• Возвращаем функцию от Functor: T1 до Functor:T2

• Сохранение идентичности

• Сохранение целостности

• Функтор – применяет функцию в упакованному значению

• Функтор – функциональный объект

Page 20: Декларативно функциональный стиль в PHP

Монады• Монада – аппликативный функтор

• Функции на типах• Функции на функциях: наращивание функций• Наращивание значений• Наращивание мульти-аргументных функций

• Выравнивание (превращаем двойной Functor в одинарный Functor)

• Связность (комбинация из наращивания и выравнивания)

• …

Page 21: Декларативно функциональный стиль в PHP

Монады• Основная задача: сделать ряд вычислений над

данными

• Основные типы:• IO – монада строгой последовательности, т.е при

связывании выполняем сначала первое, затем второе…

• Maybe – монада для отсутствующих вычислений, т.е если первое вычисление дало результат - тогда второе, иначе - ничего

• List – вычисляем результаты второй функцией от результатов первой

Page 22: Декларативно функциональный стиль в PHP

Что уже есть?

• https://github.com/ircmaxell/monad-php

• https://github.com/lstrojny/functional-php

• https://github.com/widmogrod/php-functional

www.functionalphp.com

Page 23: Декларативно функциональный стиль в PHP

• $contract->getManagementOrganization()->getShortName();call to a member function on a non-object

$monad = new Maybe($contract);$monad->bind(function($item) {

return $item->getManagementOrganization();})->bind(function($item) {

return $item->getShortName();});

ircmaxell/monad-php

Page 24: Декларативно функциональный стиль в PHP

widmogrod/php-functional

Page 25: Декларативно функциональный стиль в PHP

widmogrod/php-functional

Page 26: Декларативно функциональный стиль в PHP

widmogrod/php-functional

Page 27: Декларативно функциональный стиль в PHP

Положительные моменты ДП• Лямбды – универсальный инструмент дизайна

• Краткость функционального кода

• Высокая модульность

• Хорошая тестируемость

• Редуцируемость структуры ПО

• Многие задачи решаются проще, понятнее

• Больше внимания задаче, а не борьбе с языком

• Чистота функций (детерминированность)

Page 28: Декларативно функциональный стиль в PHP

Проблемы и особенности• Увеличенный объем копирования данных из-за

иммутабельности

• Опасные замыкания в лямбдах

• Увеличенный расход по памяти

Page 29: Декларативно функциональный стиль в PHP

Итог

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

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

• Разделение чистого кода и кода с побочными эффектами