Перевод: Почему Фп Важен Даже Для Ооп-Программистов?

Привет, Хабр! Представляю вашему вниманию перевод статьи Роман Провазник Почему FP имеет значение даже для ООП-разработчика? Однажды меня очень заинтересовало функциональное программирование, я начал его изучать и рассказывать всем, кого знал, о том, насколько это замечательно.

Позже я наткнулся на статью о функциональном программировании с точки зрения ООП-программиста и решил перевести ее для вас.

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

Они даже заставили меня создать учетную запись на Medium. Как бывший ООП-разработчик и на данный момент когда-нибудь я стану настоящим ФП-программистом, я думаю, мне есть что сказать:



Добро пожаловать, путешественник

Если вы не провели последние 60 лет на другой планете (если да, то с возвращением, путешественник), вы, вероятно, слышали о функциональном программировании.

Если вы следите за текущими тенденциями в индустрии программного обеспечения, вы каждый день слышите такие термины, как «функциональное программирование», «неизменяемость», «чистые функции» и «композиция».

Все это звучит круто, потрясающе и понятно, пока не подумаешь: «О, я ООП-программист и не могу (или не хочу) менять парадигму.

Что мне может дать функциональное программирование? Почему я должен беспокоиться? Как программист/энтузиаст ФП из мира ООП, я хочу поделиться тем, что мне хотелось бы знать много лет назад. Об этом можно говорить часами, поэтому давайте выберем три самых важных вещи.



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

Традиционным преимуществом FP является слово, которое обычно занимает как минимум два слайда в каждой презентации функционального программирования.

Серебряная пуля ФП, верно? Не совсем.

Хотя это слово чаще всего используется в основном функциональными программистами, оно не является исключительным для FP. Будучи ООП-разработчиком, вы можете достичь (почти) того же уровня неизменности, что и ФП-разработчик.

На самом деле это довольно просто, вам просто нужно посмотреть на свои объекты и коллекции немного по-другому.

Представьте, что вы не меняете оригинал, а создаете новую версию.

Добавили предмет в коллекцию? Большой! Вы не изменили исходную коллекцию, вместо этого у вас есть новая коллекция, содержащая добавленный элемент. Изменено свойство объекта? Большой! Теперь у вас есть новый объект с измененным свойством.

Знаю, знаю – это звучит странно.

Но это небольшое переключение сознания позволит вам спать спокойнее.

Как только вы поймете, что ваши объекты нельзя изменить (только скопировать), вы будете уверены, что никто в команде не сможет переназначить их куда-то еще.

Это все равно, что взять свою любимую древнюю кассету Pink Floyd, не опасаясь, что ее снова перезапишут с Джастином Бибером.

И в качестве бонуса ваш код будет иметь полностью отслеживаемые методы, в которых происходят реальные изменения (когда новые объекты создаются на основе исходных).

И, чуть не забыл, если вы разработчик C# или Java, вы уже используете их, вызывая «ToLower()», «Trim()» для строк, которые изначально являются неизменяемыми.

То есть по сути ничего нового.



Чистые функции

Еще одно модное словечко, которое ошибочно считают исключительно ФП.

Что такое «чистая функция»? Проще говоря, чистая функция — это функция, которая возвращает тот же результат при одном и том же входном значении без какой-либо связи с «внешним миром» (операции ввода/вывода, общее состояние и т. д.), также известными как «побочные эффекты».

Типичным примером функции такого типа может быть получение длины строки (вы же не будете подключаться к базе данных, чтобы подсчитать количество символов в строке, не так ли?), вычисление синуса и так далее.

Какую пользу это принесет ООП? То же, что и для ФП.

Если вы работаете с чистыми функциями (или методами), вы точно знаете, какой результат получите для каждого входного значения.

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

Мы все знаем, что без взаимодействия с внешним миром наше программное обеспечение было бы бесполезным, но есть ощутимая разница между чистым кодом (написанным в чистых функциях/методах) с вводом/выводом только на границах системы и системой, в которой каждый метод зависит о внутреннем состоянии.

обновляется другими методами.

Еще раз, небольшое переосмысление подхода к вводу-выводу дает все преимущества FP, плюс тестирование становится настолько простым, что наконец-то начинает приносить удовольствие.



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

Мы уже изменили точку зрения на наш код — мы можем писать более безопасный (неизменяемый) и тестируемый (чистый) код. Теперь пришло время пойти немного дальше и изменить подход к определению того, что должно делать наше программное обеспечение.

Что еще так существенно отличает ООП от ФП? В функциональном мире мы определяем «что» должно произойти, а не «как» должно произойти.

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

И это то, что вы можете сделать на своем любимом языке ООП.

Например, если вы знакомы с такими вещами, как LINQ (из C#), вы уже знаете преимущества выражений запроса, где вы можете прочитать свой код так: «Да, вот я беру 10 элементов из коллекции, сортирую их в алфавитном порядке и используйте их в качестве параметра для следующего метода».

Вы, вероятно, читали тысячи подобных выражений LINQ, даже не задаваясь вопросом, что на самом деле происходит за кулисами.

И это самое главное – сконцентрироваться на том, что действительно важно.



Краткое содержание

Я думаю, на данный момент этого достаточно.

Я не хочу в конечном итоге продавать FP как панацею.

Мир не просто черно-белый.

Правда в том, что AF для меня невероятно труден.

Почти так же сложно, как правильное ООП.

Но попробовать определенно стоит. С моей точки зрения, ООП и ФП — это во многом то, как я думаю о коде и его структуре.

Что я думаю о зависимостях, побочных эффектах, обо всем мире ввода-вывода и тестировании.

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

Теги: #перевод #фп #ООП #Совершенный код #ООП #Функциональное программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.