Блог студии Flying Machine Studios 6 декабря 2012 г.
перевод статьи Неофициальный путеводитель по мозгу Рича Хики
Частично я получил удовольствие от изучения Clojure, когда узнал о мыслях Рича Хики о программировании.
У Рича есть ясный и последовательный взгляд на фундаментальные концепции программирования, и я думаю, что каждый программист может извлечь из него пользу.
Каждый раз, когда я смотрю одно из его выступлений, у меня возникает ощущение, что кто-то взял мой разум и привел его в порядок.
В этой статье (и, возможно, в будущих статьях) я попытаюсь систематизировать и систематизировать уникальную точку зрения г-на Хики.
В заключение мне хотелось бы кратко изложить его идеи.
Я надеюсь, что это приведет к тому, что те, кто пишет на Clojure, смогут легко найти помощь, а для тех, кто не использует Clojure, — доступное введение.
Весь следующий текст основан на выступлении Рича Хики.
Введение
Современные ООП-языки — Ruby, Java, Python и т. д. — содержат фундаментальный недостаток — они привносят непредвиденные сложности, основанные на неточной модели внешнего мира и реальности.Хотя у них есть четкие определения следующих понятий, эти определения неверны:
- Ценить
- Состояние
- Личность
- Время
- Поведение
Но сначала давайте посмотрим на модели реальности, лежащие в основе ООП и ФП – это как раз то принципиальное различие, которое приводит к использованию столь разных подходов в определении описанных выше понятий.
Метафизика, программирование и вы: сравнение ООП и ФП
Как правило, когда разговор заходит о метафизике, вещи начинают терять свою четкую форму, но, к счастью, в этом есть некоторый смысл.Как учит нас Википедия, метафизика пытается как можно шире ответить на два основных вопроса:
- Что там?
- Как это выглядит?
Объектно-ориентированного программирования
Согласно метафизике ООП, река — это нечто, что действительно существует в реальном мире.Я знаю, знаю, я даже слышу, как вы спрашиваете: «Да, и чтоЭ», но поверьте мне, точность этого утверждения не давала уснуть многим философам.
Хитрость в том, что река постоянно меняется, и ее воды никогда не перестают течь.
В терминах ООП мы бы сказали, что река находится в изменчивом состоянии и постоянно колеблется.
Однако тот факт, что состояние Речного Объекта и Объектов в целом никогда не бывает постоянным в реальном мире, не мешает нам рассматривать их как фундаментальные строительные блоки наших программ.
Более того, это преподносится как преимущество ООП — как бы ни менялось состояние — вы взаимодействуете с жестко определенным интерфейсом и все работает именно так, как вы ожидаете.
Объект может меняться, но для всех наблюдателей он продолжает оставаться тем же самым объектом.
Это соответствует нашему интуитивному восприятию окружающего мира.
«Электроны в моей чашке кофе движутся, но вкус кофе по-прежнему напоминает кофе, как я и ожидал.
Ведь в ООП объекты думают. Они действуют друг на друга.
И опять-таки это соответствует нашим представлениям о мире, где изменения являются результатом воздействия одних объектов на другие.
Объект «Человек» толкает объект «Дверь» и перемещается в объект «Дом».
Функциональное программирование
Согласно метафизике ФП, мы бы сказали, что не можем войти в одну и ту же реку дважды.
То, что мы видим, — это дискретная, прерывистая вещь, которая существует в мире независимо от изменений и представляет собой совокупность других дискретных и неизменяемых вещей.
«Река» — это не вещь сама по себе, а понятие, которое мы налагаем на последовательность связанных с ней явлений.
Эта концепция очень полезна – я не буду ее объяснять – это всего лишь концепция.
На самом деле существуют частицы и процессы.
Река — это не стабильный объект, а скорее последовательность связанных частиц, созданная каким-то процессом.
Эти частицы не влияют друг на друга, и их нельзя изменить.
Они ничего не могут сделать.
Изменение — это не результат воздействия одного объекта на другой, изменение — это результат процесса, примененного к неизменяемой частице.
Сказать, что что-то изменилось, — это все равно, что сказать: «О, в этом потоке частиц появилась новая частица».
Это все равно, что сказать, что HEAD указывает на новый коммит в репозитории Git. Ладно, хватит метафизики! Теперь опишем более полезные темы, начиная со Смысла.
Ценить
Очевидно, что числа 3, 6 и 42 являются значениями.Числа постоянны и неизменны.
Также должно быть очевидно, что объектно-ориентированные языки не имеют правильного определения значений в этом смысле.
Как отмечает Рич Хики, вы можете создать класс, экземпляры которого состоят из неизменяемых частей, но у вас нет концепции высокого уровня, которая выражала бы класс в целом как неизменяемое значение.
Это одна из основных причин головной боли при использовании ООП.
Сколько раз вы рвали на себе волосы, пытаясь понять, как был изменен атрибут объекта? Фактически объектно-ориентированные языки не имеют встроенного механизма определения того, стабильно ли состояние объекта или нет. Это одна из причин, почему соревновательное программирование так сложно.
Это проблема даже в однопоточных приложениях, и именно поэтому мы вынуждены писать обширные наборы тестов.
Вы не можете быть уверены, что вызов метода объекта Wig никак не изменит объект Hipster Glasses. Напротив, функциональные языки делают упор на работу с неизменяемыми данными.
Поскольку значения не меняются, целый класс проблем просто исчезает.
Личность
В своей речи г-н Хики говорит:«Самая большая проблема в том, что мы путаем две вещи.В ФП мы оперируем простым именем, которое даем последовательности связанных частиц.Мы выразили идею, что нечто, что меняется со временем, является нашим объектом, вещью».
«Река» соответствует последовательности R1, R2, R3 и т. д., образующейся в процессе «течения» реки.
В git есть прямая аналогия с HEAD — это просто имя, указывающее на реальные значения.
В ООП такого различия нет. Или, как он сам говорит:
«Соответствие — это связь воображаемого объекта с рядом причинно связанных значений (состояний) во времени.Это ярлыки, которые мы используем для обозначения периодов времени».
Состояние
В ООП нет четкого определения состояния.Возможно, это «значение всех атрибутов объекта прямо сейчас».
И это вынужденное «прямо сейчас», потому что не существует лингвистического механизма, позволяющего заглянуть в прошлое.
Это станет яснее, если провести сравнение с понятием идентичности в ФП.
Во вселенной Hixian состояние — это определенная ценность в определенный момент времени.
(Для меня это определение действительно рассматривает все в перспективе.
)
Время
В ООП нет реального представления времени.Все происходит «прямо сейчас».
Именно это приводит к проблемам в соревновательном программировании.
Напротив, в мире ФП, который мы изучаем, концепция времени четко определена.
Время — побочный продукт процесса наименования (идентификации) состояний.
Поведение
Наконец, поведение.Мне здесь писать особо нечего - спектакли, наверное, еще посмотрю, но все же процитирую фразу господина Хики, предлагающую вам задуматься:
«Поведения нет. Когда в тебя ударяет молния, кто «ведет себя»Э»Возможно, именно это побудило Стива Йегге написать «Казнь в царстве существительных»
Конец
Ну вот и все на сегодня.Я надеюсь, что этот пост был полезен.
Если у вас есть какие-либо предложения, я буду рад их услышать!
Примечания переводчика
Статья не совсем свежая, но мне она показалась достаточно интересной, а в комментариях к оригинальному посту, наверное, было еще интереснее.К сожалению, перевод обсуждения выходит за рамки моего участия.
Теги: #clojure #функциональное программирование #fp #Перевести #программирование #Функциональное программирование #clojure
-
Канобувости, 17 Выпуск
19 Oct, 24 -
Рефлог Github V1.5.16
19 Oct, 24 -
Индия Лидирует В Области Микроплатежей
19 Oct, 24