Где все шаблоны проектирования функционального программирования? [закрыто]

75

ОО литература по программированию полна шаблонов проектирования. Большинство книг по объектно-ориентированному программированию посвящают одну или две главы разработке шаблонов, таких как фабрики и декораторы. Итак, каковы эквивалентные шаблоны в функциональных языках и почему никто еще не написал книгу о них? Есть ли что-то особенное в функциональных языках, которое устраняет необходимость в шаблонах проектирования?

davidk01
источник
6
Есть определенно функциональные шаблоны дизайна - например, памятные вещи или монады - мне также интересно, собрал ли кто-нибудь их в одном месте, хотя ...
FinnNk
2
FinnNk Monad - это скорее класс типов, чем шаблон проектирования ^ _ ^
альтернатива
Для haskell у Габриэля Гонсалеса есть несколько постов в блоге, например haskellforall.com/2012/08/the-category-design-pattern.html
bennofs
1
Карта уменьшить это одна. Я разочарован, что нет хорошего списка моделей
Шридхар Сарнобат

Ответы:

48

ОО и функциональное программирование - это две совершенно разные парадигмы программирования, а шаблоны проектирования (DP) являются важной частью проектирования и программирования ОО. ДП не играют такой роли в функциональном программировании.

Можно даже сказать, что DP не нужны в функциональном программировании - нет никакого зуда, от которого лечится DP.

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

  • Питер Норвиг обнаружил, что 16 из 23 шаблонов в книге « Шаблоны проектирования» являются « невидимыми или простыми » в Лиспе или Дилане.

  • «Многие паттерны подразумевают объектную ориентацию или, в общем, изменяемое состояние, и поэтому могут быть неприменимы в функциональных языках программирования, в которых данные являются неизменяемыми или обрабатываются как таковые». - http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29

Maglob
источник
41
Я не уверен, что согласился бы с тем, что шаблоны проектирования не применяются к FP. FP по-прежнему представляет общие проблемы, которые решаются, в частности, общими способами. Проблемы, отличные от тех, которые решаются в ОО, но все же проблемы, тем не менее. Я думаю, что этому, вероятно, просто уделено гораздо меньше внимания, чем в ОО, поскольку в настоящее время ФП менее распространена в коммерческом мире.
d11wtq
22
Утверждать, что шаблон проектирования не существует в функциональном программировании, является дезинформацией. Самый простой контрпример - это монада. Вам не нужно использовать монаду в функциональном программировании, но это очень распространенный шаблон, которому следуют люди, чтобы облегчить применение чистого функционального программирования. По сути, это определение шаблона дизайна.
voidvector
3
Шаблоны проектирования применяются ко всей деятельности по дизайну, будь то программирование или дизайн дома. Фактически, сама концепция шаблонных языков происходит от архитектуры: en.wikipedia.org/wiki/A_Pattern_Language .
BobDalgleish
2
Хм. Наблюдаемые потоки, Железнодорожная валидация и ад, почти каждая монада - это образец дизайна, верно?
Chet
2
@voidvector Монады - это не просто шаблон дизайна. В FP монады используются как функторы между системами типов, а само понятие взято из теории категорий, разделения математики. Они используются для описания определенного вида отношений между алгебраическими структурами в целом. Было бы точнее сказать, что функциональное программирование - это образец дизайна, облегчающий использование математики в программировании.
Джон
67

Джереми Гиббонс пишет книгу. Пока он не закончен, вы можете прочитать его блог « Шаблоны в функциональном программировании» . Он рекомендует читать его посты от самых старых до самых новых.

Просмотрите его публикации также. Он рассматривает шаблоны «Банды четырех» в шаблонах проектирования как «программы общего типа данных высшего порядка» и описывает шаблоны программирования с помощью рекурсивных уравнений в программировании оригами (складывает и разворачивает).

Корбин Март
источник
13

Простой факт заключается в том, что многие OO Patterns будут считаться идиомами в функциональных языках (особенно в оригинальных шаблонах GoF). Например, шаблон Iterator (встроенный в такие языки, как C # сейчас) просто не нужен в Lisp или ML, которые имеют операторы последовательности.

Множество шаблонов, которые мы используем в ОО-системах, помогают нам избавиться от «несущественного», чтобы мы могли сосредоточиться на кодировании объектов. Другими словами, шаблоны являются решениями неинтересных частей приложения. Мы должны использовать шаблоны для решения общих задач, которые были решены ранее (например, шаблоны в шаблонах архитектуры приложений предприятия Фаулера для работы с такими вещами, как передача базы данных или шаблоны xUnit для ускорения модульного тестирования), чтобы мы могли сосредоточиться на повышении эффективности бизнеса для приложения.

Я уверен, что помимо специфики шаблонов GoF, существуют шаблоны проектирования, которые будут применимы и к функциональному программированию. Дело в том, что ОО является доминирующей парадигмой. Написание книги образцов, предназначенной для функциональных разработчиков ... откровенно говоря, не получит одобрения от издателя. Вот к чему это сводится. Рынку функциональных паттернов не хватает, чтобы иметь значительное количество книг, посвященных этой теме.

Майкл Браун
источник
9

Хорошая беседа (~ 45 минут) на эту тему Стюарта Сьерры:

http://www.infoq.com/presentations/Clojure-Design-Patterns

Не обязательно обязательный и авторитетный, но я узнал ряд его примеров из собственного опыта использования FP для анализа данных.

Примеры написаны на Clojure, но, вероятно, применимы к любому языку FP. Имена, которые он дает шаблонам, которые он покрывает:

  • Государство / Событие
  • последствия
  • аккумуляторный
  • Уменьшить / Объединить
  • Рекурсивное расширение
  • Трубопровод
  • обертка
  • знак
  • наблюдатель
  • стратегия
Аарон Джонсон
источник
6

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

Не пропускайте монады. Есть куча многословных объяснений, и для того, чтобы идеи впитались, нужно приложить некоторые усилия, но если вы продолжите подключаться, в конечном итоге это рассветит вас, и вы будете поражены тем, сколько шаблонов дизайна может быть построить поверх этой одной абстракции / интерфейса.

Как только вы взяли Хакелл, у вас будет достаточно арсенала FP, чтобы быть опасным. Дело в том, продолжай, пока не получишь. Там нет ярлыков.

Марио Т. Ланца
источник
-3

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

geekosaur
источник
1
Книга Окасаки является эквивалентом части структуры данных в многочисленных книгах по структуре данных и алгоритмам, в которых обычно рассматривается только изменяемая структура данных.
AProgrammer
1
Я не думаю, что приравнивание структур данных к шаблонам проектирования отвечает всем требованиям. Это не так, как ОО-программисты просто размахивают руками, пока не появятся правильные определения классов.
davidk01
Да, книга Окасаки находится на более низком уровне, чем шаблоны проектирования.
FinnNk