Повідомлення в блозі, яке ви цитували, трохи завищує її претензії. FP не виключає необхідності моделей дизайну. Термін "шаблони дизайну" просто не широко використовується для опису одного і того ж в мовах FP. Але вони існують. Функціональні мови містять безліч правил найкращої практики форми "коли ти стикаєшся з проблемою X, використовуй код, схожий на Y", що в основному є схемою дизайну.
Однак це правильно, що більшість моделей дизайну, характерних для OOP, є неактуальними у функціональних мовах.
Я не думаю, що слід особливо суперечливо говорити про те, що моделі дизайну взагалі існують лише для усунення недоліків у мові. І якщо інша мова може тривіально вирішити ту саму проблему, для іншої мови не буде потрібна схема дизайну для неї. Користувачі цієї мови можуть навіть не усвідомлювати, що проблема існує , тому що, ну, це не проблема в цій мові.
Ось що Банда четвірок має сказати з цього приводу:
Вибір мови програмування важливий, оскільки він впливає на точку зору. Наші зразки передбачають мовні особливості рівня Smalltalk / C ++, і цей вибір визначає, що можна, а що не можна легко реалізувати. Якби ми припускали процедурні мови, ми могли б включити шаблони дизайну під назвою "Спадщина", "Інкапсуляція" та "Поліморфізм". Так само деякі наші шаблони підтримуються безпосередньо менш поширеними об'єктно-орієнтованими мовами. У CLOS є, наприклад, багато методи, які зменшують потребу в такому шаблоні, як Visitor. Насправді, між Smalltalk та C ++ є достатньо відмінностей, щоб означати, що деякі зразки можна виразити легше на одній мові, ніж на іншій. (Див., Наприклад, Ітератор.)
(Наведене вище - цитата з Вступу до книги "Шаблони дизайну", сторінка 4, параграф 3)
Основні особливості функціонального програмування включають функції як першокласні величини, каррі, незмінні значення тощо. Мені не здається очевидним, що шаблони проектування ОО наближаються до будь-якої з цих особливостей.
Який шаблон команди, якщо не наближення функцій першого класу? :) На мові FP ви просто передаєте функцію як аргумент іншій функції. У мові OOP вам потрібно перенести функцію в клас, який ви можете інстанціювати, а потім передавати цей об'єкт іншій функції. Ефект той самий, але в OOP це називається шаблон дизайну, і він вимагає набагато більше коду. А яка абстрактна фабрична закономірність, якщо не каррінг? Передайте параметри функції за раз, щоб налаштувати, яке значення вона випльовує, коли ви нарешті викликаєте її.
Так, так, кілька мод дизайну GoF виглядають надлишковими в мовах FP, оскільки існують більш потужні та прості у використанні альтернативи.
Але, звичайно, все ж є шаблони дизайну, які не вирішені мовами FP. Що таке FP-еквівалент сингла? (На мить не зважаючи на те, що одинаки, як правило, жахливий зразок.)
І це працює обома способами. Як я вже сказав, у ПП є також свої дизайнерські зразки; люди просто не вважають їх такими.
Але ви, можливо, натрапили на монадів. Що вони, як не модель дизайну для "боротьби з глобальною державою"? Це настільки проста мова на мовах OOP, що там не існує жодного еквівалентного шаблону дизайну.
Нам не потрібна схема дизайну для "збільшення статичної змінної" або "зчитування з цього сокета", тому що це саме те, що ви робите .
Говорити про монаду - модель дизайну так само безглуздо, як і говорити про цілі особи зі своїми звичайними операціями, а нульовий елемент - це шаблон дизайну. Ні, монада - це математичний візерунок , а не шаблон дизайну.
У (чистих) функціональних мовах побічні ефекти та стан змін, які неможливі, неможливі, якщо ви не працюєте над нею з монадовим «дизайнерським малюнком» або будь-яким іншим методом, що дозволяє те саме.
Крім того, у функціональних мовах, які підтримують OOP (наприклад, F # та OCaml), мені здається очевидним, що програмісти, які використовують ці мови, будуть використовувати ті самі шаблони дизайну, які є у всіх інших мовах OOP. Насправді зараз я використовую F # та OCaml щодня, і між шаблонами, якими я користуюсь у цих мовах, та зразками, якими я користуюся, коли я пишу на Java, немає різних відмінностей.
Можливо тому, що ти все ще думаєш імперативно? Багатьом людям, все життя стикаючись з імперативними мовами, важко відмовитися від цієї звички, коли вони спробують функціональну мову. (Я бачив декілька кумедних спроб у F #, де буквально кожна функція являла собою лише рядок висловлювань "нехай", в основному так, ніби ви взяли програму C і замінили всі крапки з комою на "хай". :))
Але інша можливість може полягати в тому, що ви просто не зрозуміли, що ви вирішуєте проблеми тривіально, які потребують шаблонів дизайну мовою OOP.
Коли ви використовуєте currying або передаєте функцію в якості аргументу іншому, зупиніться і подумайте, як би ви це зробили мовою OOP.
Чи є правда в твердженні, що функціональне програмування позбавляє від необхідності моделей дизайну OOP?
Так. :) Коли ви працюєте мовою FP, вам більше не потрібні специфічні шаблони дизайну OOP. Але вам все одно потрібні деякі загальні шаблони дизайну, наприклад, MVC або інші речі, що не стосуються OOP, і замість цього вам потрібна пара нових «дизайнерських моделей», характерних для FP. У всіх мов є свої недоліки, і дизайнерські зразки - це зазвичай те, як ми працюємо навколо них.
У будь-якому випадку, вам може бути цікаво спробувати свої сили на «чистіших» мовах FP, наприклад, ML (мій особистий фаворит, принаймні для навчальних цілей) або Haskell , де у вас немає милиці OOP, щоб відкинутися, коли ви зіткнулися з чимось новим.
Як і очікувалося, кілька людей заперечували проти мого визначення моделей дизайну як "виправлення недоліків у мові", тож ось моє виправдання:
Як уже було сказано, більшість моделей дизайну притаманні одній парадигмі програмування, а іноді навіть одній конкретній мові. Часто вони вирішують проблеми, які існують лише в цій парадигмі (див. Монади для ПП або абстрактні заводи для ООП).
Чому абстрактний заводський зразок не існує у FP? Тому що проблеми, яку вона намагається вирішити, не існує.
Отже, якщо існує проблема в мовах OOP, яких немає в мовах FP, то очевидно, що це є недоліком мов OOP. Проблему можна вирішити, але ваша мова цього не робить, але вимагає від вас купіння кодового коду, щоб обійти її. В ідеалі, ми б хотіли, щоб наша мова програмування магічно усунула всі проблеми. Будь-яка проблема, яка все ще є, в принципі є недоліком мови. ;)