Функциональное программирование против объектно-ориентированного программирования [закрыто]

StackOverflow https://stackoverflow.com/questions/2078978

Вопрос

До сих пор я в основном занимался ОО-программированием и с нетерпением жду возможности изучить функциональный язык.Мои вопросы таковы:

  • Когда вы предпочитаете функциональное программирование объектно-ориентированному?
  • Каковы типичные определения задач, в которых функциональное программирование является лучшим выбором?
Это было полезно?

Решение

Когда вы предпочитаете функциональное программирование объектно-ориентированному?

Когда вы ожидаете другого рода эволюции программного обеспечения:

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

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

Когда эволюция идет неправильным путем, возникают проблемы:

  • Добавление новой операции в объектно-ориентированную программу может потребовать редактирования многих определений классов для добавления нового метода.

  • Добавление чего-то нового в функциональную программу может потребовать редактирования многих определений функций для добавления нового случая.

Эта проблема хорошо известна уже много лет;в 1998 году, Фил Уодлер назвал это «проблемой самовыражения»..Хотя некоторые исследователи считают, что проблему выражения можно решить с помощью таких языковых функций, как миксины, широко распространенное решение еще не стало общепринятым.

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

Функциональные языки превосходно манипулируют символьными данными в древовидной форме.Любимый пример — компиляторы, где исходный и промежуточный языки меняются редко (в основном одни и те же). вещи), но авторы компиляторов всегда добавляют новые переводы и улучшения или оптимизации кода (новые операции над вещами).Компиляция и перевод в более общем смысле являются «убийцами» для функциональных языков.

Другие советы

Вам не обязательно выбирать между двумя парадигмами.Вы можете написать программное обеспечение с объектно-ориентированной архитектурой, используя множество функциональных концепций. ФП и ООП ортогональны по своей природе..

Возьмем, к примеру, C#.Можно сказать, что это в основном ООП, но существует множество концепций и конструкций ФП.Если вы считаете Линк, наиболее важные конструкции, которые позволяют Linq существовать, функциональны по своей природе: лямбда-выражения.

Другой пример, F#.Вы могли бы сказать, что это в основном ФП, но существует множество концепций и конструкций ООП.Вы можете определять классы, абстрактные классы, интерфейсы, заниматься наследованием.Вы даже можете использовать изменчивость, когда она делает ваш код более понятным или когда значительно повышает производительность.

Многие современные языки являются мультипарадигмальными.

Рекомендуемое чтение

Поскольку я нахожусь в той же лодке (опыт ООП, изучение ФП), я бы предложил вам несколько книг, которые мне очень понравились:

Предложения по объектно-ориентированному программированию:

  1. Инкапсуляция, для
    • контролируйте мутацию внутреннего состояния
    • ограничьте связь с внутренним представлением
  2. Подтипирование, позволяющее:
    • замена совместимых типов (полиморфизм)
    • грубое средство совместного использования реализации между классами (наследование реализации)

Функциональное программирование в Haskell или даже в Scala может допускать замену с помощью более общего механизма классов типов.Изменяемое внутреннее состояние либо не рекомендуется, либо запрещено.Также может быть достигнута инкапсуляция внутреннего представления.Видишь Хаскелл против ООП для хорошего сравнения.

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

ОТРЕДАКТИРОВАННЫЙ Удалена ссылка на неявные преобразования при обсуждении классов типов.В Scala классы типов кодируются с помощью неявных параметров, а не преобразований, хотя неявные преобразования являются еще одним средством достижения замены совместимых типов.

  1. Если вы работаете в среде с высокой степенью параллелизма, вам пригодится чисто функциональное программирование.Отсутствие изменяемого состояния делает параллелизм практически тривиальным.См. Эрланг.

  2. В мультипарадигмном языке вы можете захотеть смоделировать некоторые вещи функционально, если наличие изменяемого состояния является деталью реализации, и, таким образом, FP является хорошей моделью для проблемной области.Например, см. понимание списков в Python или стандартный диапазон на языке программирования D.Они вдохновлены функциональным программированием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top