Подтвердить что ты не робот

Безстоящее объектно-ориентированное программирование против функционального программирования?

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

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

Итак, мой вопрос заключается в том, что OO может использовать безгражданство, и ничего о объектах не означает, что это состояние, является ли ООП эффективным надмножеством FP? Существуют ли дополнительные преимущества/особенности FP, которые делают многопоточность более практичным, чем в ООП?

4b9b3361

Ответ 1

Это вопрос степени.

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

Аналогично выполнению OO в C является хорошей. Бывают случаи, когда ваши ограничения таковы, что C является правильным выбором, и структура OO также является правильным выбором. Хорошим примером этого является GTK. Очень сложно написать набор инструментов пользовательского интерфейса без ООП. Однако это означает, что вы выполняете работу, которая обычно выполняется компилятором. Некоторые вещи, которые легки на одном языке, становятся трудными или невозможными на языке без синтаксической и семантической поддержки. Например, я никогда не видел проект C, который эмулировал множественное наследование. Это слишком большой ручной труд.

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

Что касается того, является ли ООП надмножеством FP, я даже не думаю, что концепция имеет смысл. С точки зрения выражения программ они оба вполне способны. Вы можете реализовать язык OO на языке FP и наоборот. Иногда один ближе к проблемной области, иногда другой. Несмотря на это, я думаю, что ваш реальный вопрос заключается в том, нужно ли FP или нет, и ответ на этот вопрос нет; используйте то, что вам нравится.

Я думаю, вы также должны рассмотреть возможность проверки модели Actor, потому что она более адекватна OO, а не недружественная (несовместимая с государством), при этом все еще приносит преимущества масштабируемости/ parallelism.

Ответ 2

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

Я думаю, что это, как программист на C, говорит, что, поскольку методы C могут быть объединены в структуру и заменены, не делает C-надмножество OO? Фактически, это то, как первоначально был реализован С++, но он не делает C языком OO.

Ответ 3

FP - это больше о том, как вы решаете проблемы, чем язык, который вы используете. Таким образом, ООП не является надмножеством FP. Некоторые конструкции в FP (mapReduce,...) могут быть неявно преобразованы в многопоточное приложение. Но ничто не мешает вам использовать их в ООП. Это все о мышлении.