Рубрики
Без рубрики

Как я случайно изучил функциональное программирование

Написав занятия со слишком большим количеством обязанностей. Tagged с функциональным, Python.

У меня было два курса по программированию в университете, в Яве и С. Курс Java преподавал объектно-ориентированное программирование: объекты, классы, наследование и все такое.

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

Узнав Java в универе, я подумал про себя: «Мне нужно создать класс для моего алгоритма, и он должен иметь сеттеры и получение данных для данных и входов алгоритма. “Мои первые реализации алгоритма затем выглядели примерно как следующее:

algorithm = new Algorithm();
algorithm.add_data(data);
# Wait for an input event
algorithm.process(input);
output = algorithm.get_result();
# Wait for the next input
algorithm.process(input);
output = algorithm.get_result();

add_data По сути, является сеттером для данных, требуемых алгоритмом, и процесс это функция, которая обрабатывает входные данные алгоритма в выходы и хранит их во внутреннем состоянии для последующего поиска с get_result метод

Я честно думал, что это гибкий дизайн. С add_data Метод, пользователи класса смогут добавить больше данных в алгоритм во время выполнения. Также процесс Функция была очень гибкой в том смысле, что она ничего не вернула. Вместо этого он сохранил вывод алгоритма во внутренний состояние и оставил его пользователю, чтобы решить, как они хотели бы получить выход. Может быть, они хотели бы получить результат алгоритма в довольно напечатанной форме вместо «сырой» формата, поэтому я мог бы просто добавить еще один GET_RESULT_PRETTYPRINTTED Метод позже.

Но это не хороший дизайн. Любой пользователь Алгоритм Классу потребуется руководство пользователя, чтобы узнать, какие методы вызовать и в каком порядке. Также было бы трудно охватить все угловые чехлы для того, что делать, если пользователь назвал методы в неправильном порядке.

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

Давайте избавимся от add_data Загрузив данные в конструктор:

algorithm = Algorithm(data)
algorithm.process(input)
output = algorithm.get_result()

Что если нам нужно было добавить больше данных в Алгоритм во время выполнения? Вот что это за add_data Было так хорошо для! Но сейчас у нас нет такого требования и, возможно, никогда не будет, так зачем добавлять его? Во -вторых, даже если нам пришлось добавить больше данных в Алгоритм , мы могли бы просто создать новый Алгоритм экземпляр, объединив старые и новые данные с чем -то вроде Алгоритм (Old_Data + new_data) Анкет

Можем ли мы избавиться от процесс метод? Да:

algorithm = Algorithm(data)
output = algorithm.compute(input)

Возвращаем вывод из вычислить функционируйте и избавьтесь от процесс . Но как насчет великого плана о Алгоритм Класс имеет несколько альтернативных методов для доступа к результату в формате, требуемом пользователем? Конечно, это было бы полезно!

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

Можем ли мы обрезать класс еще больше? Некоторые люди говорят, что занятия с одним методом не должно быть занятиями . Давайте избавимся от класса:

from functools import partial

def algorithm(data, input):
  ...
  return output

output = algorithm(data, input)
# Or if you need the algorithm elsewhere
algo = partial(algorithm, data)
output = algo(data)

И вот и это, мы заменили весь класс на чистая функция без побочных эффектов. Мы закончили тем, что сделали некоторое функциональное программирование, заменив класс внутренним состоянием чистой функцией. Ключевым моментом во всем вышеперечисленном, однако, не является то, что мы заменили класс функцией. Ключевым моментом является то, что мы подстригли наш алгоритм до одной ответственности.

Мое обучение из вышеизложенного заключается в том, что в объектно-ориентированных дизайнах скрывается опасность: легко получить огромные классы, которые имеют слишком много обязанностей. Функциональное программирование имеет тенденцию, на мой взгляд, приводит к более отдельному дизайну. Это не означает, что одна парадигма лучше другой. Все, что я говорю, это: будьте осторожны, когда пишу уроки.

Оригинал: “https://dev.to/ksaaskil/how-i-accidentally-learned-functional-programming-1g1m”