Функциональное программирование против объектно-ориентированного программирования [закрыто]
до сих пор я в основном подвергался программированию OO и с нетерпением жду изучения функционального языка. Мои вопросы:
- когда вы выбираете функциональное программирование над объектно-ориентированным?
- каковы типичные определения проблем, где функциональное программирование является лучшим выбором?
4 ответов:
когда вы выбираете функциональное программирование над объектно-ориентированным?
когда вы ожидаете другой вид эволюции программного обеспечения:
объектно-ориентированные языки хороши, когда у вас есть фиксированный набор операции on вещи, и по мере развития вашего кода Вы в первую очередь добавляете новые вещи. Это может быть достигнуто путем добавления новых классов, которые реализуют существующие методы, а существующие классы остаются один.
функциональные языки хороши, когда у вас есть фиксированный набор вещи, и как ваш код развивается, вы в первую очередь добавить новый операции о существующих вещах. Это может быть достигнуто путем добавления новых функций, которые вычисляют с существующими типами данных, и существующие функции остаются одни.
когда эволюция идет неправильным путем, у вас есть проблемы:
добавление новой операции для добавления нового метода в объектно-ориентированную программу может потребоваться редактирование многих определений классов.
добавление нового вида вещей в функциональную программу может потребовать редактирования многих определений функций для добавления нового случая.
эта проблема была хорошо известна в течение многих лет; в 1998 году Фил Уодлер назвал это "проблемой выражения". Хотя некоторые исследователи считают, что проблема выражения может быть решена с помощью такого языка особенности как mixins, широко принятое решение еще не попало в основное русло.
каковы типичные определения проблем, где функциональное программирование является лучшим выбором?
функциональные языки превосходно управляют символьными данными в виде дерева. Любимый пример-компиляторы, где исходный и промежуточный языки меняются редко (в основном то же самое вещи), но составители компиляторов всегда добавляют новые переводы и код улучшения или оптимизации (новые операции над вещами). Компиляция и перевод в целом являются "убийственными приложениями" для функциональных языков.
вам не обязательно выбирать между двумя парадигмами. Вы можете написать программное обеспечение с архитектурой OO, используя множество функциональных концепций. FP и ООП ортогональны по своей природе.
возьмем для примера C#. Можно сказать, что это в основном ООП, но есть много концепций и конструкций FP. Если вы считаете Linq, наиболее важные конструкции, которые позволяют Linq существовать являются функциональными по своей природе:лямда выражения.
другой пример, F#. Можно сказать, что это в основном FP, но есть много концепций и конструкций ООП. Вы можете определять классы, абстрактные классы, интерфейсы, заниматься наследованием. Вы даже можете использовать изменяемость, когда она делает ваш код более ясным или когда он резко повышает производительность.
многие современные языки мульти-парадигмы.
рекомендуемая литература
Как я в той же лодке (ООП фон, обучение FP), я бы предложил вам некоторые чтения, которые я действительно оценил:
функциональное программирование для повседневной разработки .NET, Джереми Миллер. Отличная статья (хотя и плохо отформатированная), показывающая множество методов и практических, реальных примеров FP на C#.
Реальное Функциональное Программирование, исполнителя Tomas Petricek. Большая книга, которая имеет дело в основном с концепциями FP, пытаясь объясните, что это такое, когда их следует использовать. Есть много примеров как в F#, так и в C#. Кроме того,Petricek это является отличным источником информации.
объектно-ориентированное программирование предлагает:
- инкапсуляция, чтобы
- контроль мутации внутреннего состояния
- предельная связь с внутренним представлением
- подтипов, позволяя:
- замена совместимых типов (полиморфизм)
- грубое средство совместного использования реализации между классами (наследование реализации)
функциональное программирование, in Haskell или даже в Scala, может позволить замену через более общий механизм классов типов. Изменчивое внутреннее состояние либо обескуражено, либо запрещено. Инкапсуляция внутреннего представления также может быть достигнута. Смотрите Хаскелл против ООП для хорошего сравнения.
утверждение Нормана о том, что " добавление нового вида вещи в функциональную программу может потребовать редактирования многих определений функций для добавления нового случая."зависит от того, насколько хорошо функциональный код использовал тип занятия. Если сопоставление шаблонов для определенного абстрактного типа данных распространяется по всей кодовой базе, вы действительно будете страдать от этой проблемы, но это, возможно, плохой дизайн для начала.
редактировать удалена ссылка на неявные преобразования при обсуждении классов типа. В Scala классы типов кодируются неявными параметрами, а не преобразованиями, хотя неявные преобразования являются еще одним средством для достижения подстановки совместимых типов.
Если вы находитесь в сильно параллельной среде, то чистое функциональное программирование полезно. Отсутствие изменяемого состояния делает параллелизм почти тривиальным. Увидеть Эрланг.
в мультипарадигмальный язык, вы можете моделировать некоторые вещи функционально, если наличие изменяемого состояния, должна деталь реализации, и, таким образом, ФП является хорошей моделью для проблемной. Например, представление списков в Python или std.диапазон в языке программирования. Они вдохновлены функциональным программированием.
Comments