Функтиональное програмирование
Прочитал статью на хабре
https://habr.com/ru/company/jugru/blog/545482/
Кто нибудь на пальцах может сказать, что такое функтиональное программирование и в чем его преимущество перед ООP
На пальцах все просто. У тебя есть только чистые функции и вся программа цепь вызова этих самых функций.
Чистая функция - это когда значение функции зависит только от входящих параметров и ни от чего больше. Никаких внешних
или глобальных переменных. Вообще никаких переменных. Ничего этого нет.
Ну и основные преимущества: Правильность работы программы можно доказать. Сильно упрощается тестирование.
Т.к. функции чистые, то нам не важен порядок вычислений и можно лучше оптимизировать выполнение. Например, один раз
вычислив функцию про заданных параметрах можно закэшировать результат.
то нибудь на пальцах может сказать, что такое функтиональное программирование и в чем его преимущество перед ООP
Могу попробовать...
параметры -> функция -> новый результат.
Для работы функции нужны только её параметры.
Функция получает параметры и возвращает результат. Что происходит внутри функции не меняет ни параметры ни систему (и именно поэтому IO это всегда головная боль).
Типы! Если вы поклонник дак-тайпинга, ну, яваскрипист или (не дай бог) пыхыпыст - проходите мимо.
Что это даёт?
Параллелизация. Так как функция самодостаточна их можно запускать хоть 100500 параллельно. Они друг-другу мешать не будут.
Верификация. Инварианты для функций без побочных эффектов писать не просто проще, а возможно.
В среднем меньше ошибок (нет побочных эффектов и типизация).
Машины могут кешировать результаты вызовов. Если мы передали функции два параметра "10" и "Вася" и получили 42 нам не надо её ещё раз вызывать с этими же параметрами. Мы знаем что она вернет 42.
Математики в восторге... Но тут я уже всё что можно забыл... Можно про хаскел почитать - если продраться через систему типов, монады, функторы, композицию функций и те пе, становится очень интересно.
В чём недостаток... Имхо, главный в том, что думать надо по-другому. ООП более "общечеловеческое", его понять легче. Головная боль как связать красоту функций и реальный мир. I/O страшное дело.
гм. Ну если мне надо пару значений перемножить, я действительно напишу функцию. Статическую. В статическом классе. Но в основном чистых функций не бывает. Допустим заказ в ресторане. Он зависит не только от входных параметров, но и от условий окружения. Класс для принятия решения собирает информацию. Из базы данных, из других источников. Сбор может быть сложным. Многоходовым. И это все в одной функции? И что делать, если она нечистая?
Окружение - это тоже функции передающиеся в функцию заказа.
Как взаимодействовать с нечистым окружением - отдельный вопрос. Делают, например, чистое ядро и вызывают его функции из нечистого кода.
Для вызова функций с побочными эффектами придумали монады и т.д. и т.п.
Окружение - это тоже функции передающиеся в функцию заказа.
Ок, Функция передается в функцию как параметр. Это значит, что результат выполнения верхней функции зависит от передаваемой. Какое отличие от классов и завицимостей в ООП? Это же тоже зависимости?
Естественно у тебя есть зависимости (значение функции прекрасно зависит от своих аргументов) и даже состояние, на самом деле, никуда не делось.
Просто раньше все было в переменных , а теперь размазано по стеку. Это просто другой подход при котором твоя программа - это просто цепочка вычислений.
В идеале ни циклов, ни переменных ни ифов. Ничего. Красота же!
гм. Ну если мне надо пару значений перемножить, я действительно напишу функцию. Статическую. В статическом классе. Но в основном чистых функций не бывает. Допустим заказ в ресторане. Он зависит не только от входных параметров, но и от условий окружения. Класс для принятия решения собирает информацию. Из базы данных, из других источников. Сбор может быть сложным. Многоходовым. И это все в одной функции? И что делать, если она нечистая?
Не-а. Замучаешься сложную, многоходовую делать. Кучу небольших функций пишешь, а потом "нанизываешь" в вызов. Класс собирает информацию (что против DI), а функция получает в параметрах.
Например, посчитаем стоимость заказа на хаскеле, если есть список блюд и функция, возвращающая цену (в которой будем прятать доступ к бд), она у нас "impure". Надеюсь что ещё не всё забыл и код частично правильный :)
calculateOrderPrice :: (Order -> Int) -> [Order] -> Int calculateOrderPrice priceProvider [] = 0 calculateOrderPrice priceProvider (order:orders) = priceProvider order + calculateOrderPrice priceProvider orders