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

Попробуйте использовать это.

[0-9]{2}[/][0-9]{2}[/][0-9]{4}$

это должно работать с этим шаблоном DD/DD/DDDD, где D - любая цифра (0-9)

746
задан 5 revs, 4 users 59% 22 August 2017 в 12:23
поделиться

4 ответа

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

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

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

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

Когда Evolution идет неправильно, у вас возникли проблемы:

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

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

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

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

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

1170
ответ дан 22 November 2019 в 21:24
поделиться

Объектно-ориентированное программирование предлагает:

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

функциональное программирование, в Haskell или даже в Scala, может позволить замену через более общий механизм классов типов. Мутируемое внутреннее состояние либо не поощряется, либо запрещено. Также может быть достигнута инкапсуляция внутреннего представления. Хорошее сравнение см. в Haskell vs OOP.

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

EDITED Удалена ссылка на неявные приведения при обсуждении классов типов. В Scala классы типов кодируются с неявными параметрами, а не с приведениями, хотя неявные приведения являются еще одним средством достижения подстановки совместимых типов.

31
ответ дан 22 November 2019 в 21:24
поделиться
  1. Если вы находитесь в сильно параллельной среде, то полезно чистое функциональное программирование. Отсутствие мутирующего состояния делает параллельность почти тривиальной. См. Эрланг.

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

24
ответ дан 22 November 2019 в 21:24
поделиться

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

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

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

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

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

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

173
ответ дан 22 November 2019 в 21:24
поделиться