Жаргон функционального программирования
У функционального программирования много преимуществ, и его популярность постоянно растет. Но, как и у любой парадигмы программирования, у ФП есть свой жаргон. Мы решили сделать небольшой словарь для всех, кто знакомится с ФП.
В примерах используется JavaScript ES2015). (Почему JavaScript?)
Работа над материалом продолжается; присылайте свои пулл-реквесты в оригинальный репозиторий на английском языке.
В документе используются термины из спецификации Fantasy Land spec по мере необходимости.
Arity (арность)
Количество аргументов функции. От слов унарный, бинарный, тернарный (unary, binary, ternary) и так далее. Это необычное слово, потому что состоит из двух суффиксов: «-ary» и «-ity.». Сложение, к примеру, принимает два аргумента, поэтому это бинарная функция, или функция, у которой арность равна двум. Иногда используют термин «диадный» (dyadic), если предпочитают греческие корни вместо латинских. Функция, которая принимает произвольное количество аргументов называется, соответственно, вариативной (variadic). Но бинарная функция может принимать два и только два аргумента, без учета каррирования или частичного применения.
Higher-Order Functions (функции высокого порядка)
Функция, которая принимает функцию в качестве аргумента и/или возвращает функцию.
Partial Application (частичное применение)
Частичное применение функции означает создание новой функции с пред-заполнением некоторых аргументов оригинальной функции.
Также в JS можно использовать Function.prototype.bind для частичного применения функции:
Благодаря предварительной подготовке данных частичное применение помогает создавать более простые функции из более сложных. Функции с каррированием автоматически выполняют частичное применение.
Currying (каррирование)
Процесс конвертации функции, которая принимает несколько аргументов, в функцию, которая принимает один аргумент за раз.
При каждом вызове функции она принимает один аргумент и возвращает функцию, которая принимает один аргумент до тех пор, пока все аргументы не будут обработаны.
Auto Currying (автоматическое каррирование)
Трансформация функции, которая принимает несколько аргументов, в новую функцию. Если в новую функцию передать меньшее чем предусмотрено количество аргументов, то она вернет функцию, которая принимает оставшиеся аргументы. Когда функция получает правильное количество аргументов, то она исполняется.
Дополнительные материалы
Function Composition (композиция функций)
Соединение двух функций для формирования новой функции, в которой вывод первой функции является вводом второй.
Purity (чистота)
Функция является чистой, если возвращаемое ей значение определяется исключительно вводными значениями, и функция не имеет побочных эффектов.
Side effects (побочные эффекты)
У функции есть побочные эффекты если кроме возврата значения она взаимодействует (читает или пишет) с внешним изменяемым состоянием.
Idempotent (идемпотентность)
Функция является идемпотентной если повторное ее исполнение производит такой же результат.
Point-Free Style (бесточечная нотация)
Написание функций в таком виде, что определение не явно указывает на количество используемых аргументов. Такой стиль обычно требует каррирования или другой функции высокого порядка (или в целом — неявного программирования).
Predicate (предикат)
Предикат — это функция, которая возвращает true или false в зависимости от переданного значения. Распространенный случай использования предиката — функция обратного вызова (callback) для фильтра массива.
Categories (категории)
Объекты с функциями, которые подчиняются определенным правилам. Например, моноиды.
Value (значение)
Все, что может быть присвоено переменной.
Constant (константа)
Переменная, которую нельзя переназначить после определения.
Константы обладают референциальной прозрачностью или прозрачностью ссылок (referential transparency). То есть, их можно заменить значениями, которые они представляют, и это не повлияет на результат.
Functor (функтор)
Pointed Functor (указывающий функтор)
Lifting — это когда значение помещается в объект вроде функтора. Если «поднять» (lift) функцию в аппликативный функтор, то можно заставить ее работать со значениями, которые также присутствуют в функторе.
Referential Transparency (прозрачность ссылок)
Если выражение можно заменить его значением без влияния на поведение программы, то оно обладает прозрачностью ссылок.
Например, есть функция greet :
Lambda (лямбда)
Анонимная функция, которую можно использовать как значение.
Лямбды часто передают в качестве аргументов в функции высокого порядка.
Лямбду можно присвоить переменной.
Lambda Calculus (лямбда-исчисление)
Область информатики, в которой функции используются для создания универсальной модели исчисления.
Lazy evaluation (ленивые вычисления)
Механизм вычисления при необходимости, с задержкой вычисления выражения до того момента, пока значение не потребуется. В функциональных языках это позволяет создавать структуры вроде бесконечных списков, которые в обычных условиях невозможны в императивных языках программирования, где очередность команд имеет значение.
Monoid (моноид)
Объект с функцией, которая «комбинирует» объект с другим объектом того же типа. Простой пример моноида это сложение чисел:
В этом случае число — это объект, а + это функция.
Также необходимо, чтобы группировка операций не влияла на результат (ассоциативность):
Конкатенация массивов — это тоже моноид:
Нейтральный элемент — это пустой массив []
Если существуют функции нейтрального элемента и композиции, то функции в целом формируют моноид:
foo — это любая функция с одним аргументом.
Monad (монада)
of также известен как return в других функциональных языках.
chain также известен как flatmap и bind в других языках.
Comonad (комонада)
Extract берет значение из функтора.
Extend выполняет функцию на комонаде. Функция должна вернуть тот же тип, что комонада.
Applicative Functor (аппликативный функтор)
Это полезно, когда есть два объекта, и нужно применить бинарную операцию на их содержимом.
В итоге получим массив функций, которые можно вызвать с ap чтобы получить результат:
Morphism (морфизм)
Endomorphism (эндоморфизм)
Функция, у которой ввод и вывод — одного типа.
Isomorphism (изоморфизм)
Пара структурных трансформаций между двумя типами объектов без потери данных.
Например, двумерные координаты можно хранить в массиве [2,3] или объекте
Setoid
Сделать массив сетоидом:
Semigroup (полугруппа)
Foldable
Type Signatures (сигнатуры типа)
Часто функции в JavaScript содержат комментарии с указанием типов их аргументов и возвращаемых значений. В сообществе существуют разные подходы, но они все схожи:
Если функция принимает другую функцию в качестве аргумента, то ее помещают в скобки.
Дополнительные материалы
Union type (тип-объединение)
Комбинация двух типов в один, новый тип.
Операция + в JavaScript работает со строками и числами, так что можно использовать наш новый тип для описания его ввода и вывода:
Тип-объединение также известно как алгебраический тип, размеченное объединение и тип-сумма.
Существует пара библиотек в JavaScript для определения и использования таких типов.
Product type (тип-произведение)
Тип-произведение комбинирует типы таким способом, который вам скорее всего знаком:
Его называют произведением, потому что возможное значение структуры данных это произведение (product) разных значений.
Option (опцион)
Что такое React Mock API? И как его использовать?
Доброго времени суток!
Есть react-приложение с axios запросами на сервер. Иногда случается так, что сервер перестает работать. Мне сказали за’mock’ать api методы на клиенте, дабы иметь возможность работать и без сервера.
Что это значит? Правильно ли я понимаю, что можно добавить код, который будет перехватывать api запросы и возвращать те данные, которые я укажу? Как я понимаю, это используется для тестирования (в интернете по запросу «react mock api» выдаются статьи по тестированию). А можно ли применить это не для тестирования, а для работы без активного сервера?
Буду благодарен за объяснения и ссылки на ресурсы, где можно почитать обо всем этом.
такого апи нет. Реакту вообще все равно ходите вы на сервер или берете данные еще откуда-то
Можно замокать запросы и в приложении для работы без сервера, раз у вас axios, то смотрите как это лучше сделать для него.
Запрос к серверному api это асинхронные функции, которые посылают запрос и ждут ответа, соответственно вы можете подменить их на свои, например у вас есть объект с функциями серверного запроса
И есть моковые запросы с теми же самыми ключами, что и serverAPI
И создайте объект
const currentAPI = serverAPI
все запросы из кода делайте к currentAPI, переключать его с мокового на нормальный и наоборот можно
Сохранять данные мокового DB можно в localStorage между сеансами. естественно это будет работать только локально
Как правильно замокать коннекшен через Mockito или протестировать методы работающие с базой данных по другому?
есть Connection pull
вот такой
к нему есть контекст.
приложение работает нормально.
теперь хочу написать тесты к методам из класса DBManager работающие с базой данных. вот таким например
но JUnit не понимает пула томката. и отказывается коннектится к базе
хочу подменить этот пул на обычный конекшен
с помощью Mock. или может есть другой способ это правильно сделать?
подскажите пожалуйста. второй день бьюсь не работает никак.
Никто не мокает коннекшен. Это не твоя библиотека а драйверно-базовая. И в ней нет бизнес-логики и нечего тестировать. Ты же не сотрудник Oracle? Верно?
Тебе нужно сделать декомпозицию твоей задачи на DAO объекты и бизнес логику и замокать только DAO.
Тогда процесс тестирования упрощается.
2) Можно создать усеченную копию БД и перезагрузить ее в H2/HSQL/Derby. Это встроенные в Java двигатели SQL которые частично совметсимы c твоей основной БД (Oracle/MSSQL). И если тебе повезет то базу можно иметь всегда под рукой прямо в коде проекта. Развернуто я это описать не могу. Слишком много опций и много вариантов. И слишком мало возможностей тостера чтобы это обсуждать. Лучше найди готовый проект который тестируется таким образом для примера.



