ФП и ОО ортогональны?

13

Я слышал это снова и снова, и я пытаюсь понять и подтвердить идею, что FP и OO ортогональны.

Прежде всего, что означает, что 2 понятия являются ортогональными?

FP поощряет неизменность и чистоту в максимально возможной степени. и ОО кажется чем-то, что построено для состояния и мутации (слегка организованная версия императивного программирования?). И я понимаю, что объекты могут быть неизменными. Но ОО, кажется, подразумевает состояние / изменение для меня.

Они кажутся противоположностями. Значит ли это, что они ортогональны?

Такой язык, как Scala, позволяет легко использовать как OO, так и FP, влияет ли это на ортогональность двух методов?

letronje
источник
5
Объектная ориентация не требует, чтобы объекты управляли его состоянием. Методы могут возвращать новые объекты в качестве результатов. Тот факт, что можно и часто можно изменять состояние объекта, не означает, что он должен это делать, или это хорошая идея. ОО и ФП не являются противоположностями.
Гуперникетес
4
Дубликат на стеке потока: FP и OO ортогональны?
sepp2k

Ответы:

22

Термин «ортогональный» происходит от математики, где он имеет синоним «перпендикулярно». В этом контексте вы можете понять это как «две вещи не имеют ничего общего друг с другом».

Когда люди сравнивают FP и OO, они часто путают две разные оси.

С одной стороны, у вас есть функциональное программирование по сравнению с императивным программированием. Джонас дает хорошее сравнение двух. Версия с одним предложением говорит, что «поток данных против потока управления».

Другая ось - абстракция данных. Такие языки, как Haskell, используют абстрактные типы данных для абстрактных данных. Smalltalk использует объекты, которые объединяют данные и операции над этими данными в единый блок. Уильям Кук объясняет лучше, чем я, в своей статье « Понимание абстракции данных» .

Совершенно понятно, что большинство людей в конечном итоге думают, что FP и OO являются противоположностями: большинство языков OO являются обязательными, поэтому, если вы сравните, скажем, Haskell и Java, у вас будет поток данных + ADT против потока управления + объект. Но есть и другие возможности! Матиас Феллайзен объясняет, как счастливо жениться на ФП и ОО в своем выступлении « Функциональные объекты» .

Фрэнк Шиарар
источник
+1, отличный ответ. Ваш ответ отсутствует на классах типов Haskell.
фактор
Наверняка. Я только только начал фактически изучать Haskell.
Фрэнк Шиарар
Интересно, есть ли запись этой презентации Функциональных объектов ... Мне действительно интересно, но одни только слайды на самом деле не делают этого.
Рей Миясака
9

Прежде всего, что означает, что 2 понятия являются ортогональными?

Это означает, что эти два понятия не имеют противоположных идей или не являются несовместимыми друг с другом.

FP поощряет неизменность и чистоту в максимально возможной степени. и ОО кажется чем-то, что построено для состояния и мутации (слегка организованная версия императивного программирования?). И я понимаю, что объекты могут быть неизменными. Но ОО, кажется, подразумевает состояние / изменение для меня.

Они кажутся противоположностями. Как это влияет на их ортогональность?

Такой язык, как Scala, позволяет легко использовать как OO, так и FP, влияет ли это на ортогональность двух методов?

ОО - это инкапсуляция, состав объектов, абстракция данных, полиморфизм посредством подтипирования и контролируемая мутация, когда это необходимо (неизменность также поддерживается в ОО). FP - это композиция функций, управляющая абстракция и ограниченный полиморфизм (он же параметрический полиморфизм). Таким образом, две идеи не противоречат друг другу. Они оба предоставляют вам различные виды полномочий и механизмов абстракции, которые, безусловно, можно использовать на одном языке. На самом деле, это тезис, на котором была построена Scala !

В своем выступлении в Scala Experiment в Google Мартин Одерски очень хорошо объясняет, как он считает, что две концепции - OO и FP - ортогональны друг другу и как Scala элегантно и плавно объединяет две парадигмы в новую парадигму, широко известную в сообществе Scala как объектно-функциональная парадигма. Должен смотреть разговор за вас. :-)


Другие примеры объектно-функциональных языков: OCaml , F # , Nemerle .

missingfaktor
источник
1
«Это означает, что эти два понятия не имеют противоположных идей или не несовместимы друг с другом». - Это правда, но я думаю, что сказал бы что-то вроде « отчетливый, но не несовместимый». Например, если бы одно было подмножеством другого, то они не были бы несовместимыми, но они также не были бы ортогональными.
Тим Гудман
@Tim: Это была моя [возможно, неудачная] попытка определить термин. Видите ли, я не английский гуру. : - |
фактор
7

Ортогональный примерно означает «независимый».

Таким образом, если FP и OO ортогональны, это означает, что вы можете использовать неизменяемость независимо от того, используете вы объекты или нет, и вы можете использовать объекты независимо от того, являются ли они неизменяемыми или нет.

Примечание для себя - придумайте имя
источник
2
«Независимый» - хороший способ выразить это. Дело не в том, что они противоположны, а в том, является ли ваш код функциональным стилем программирования или объектно-ориентированным стилем программирования - это две разные вещи. Думайте о них как о осях x и y на графике - вы можете перемещаться вверх и вниз по одной, оставаясь неподвижными на другой. (В математическом смысле вектор в направлении x и вектор в направлении y буквально ортогональны - определение CS связано.)
Тим Гудман
@TimGoodman: Мне очень понравилась ось x, y на аналогии с графиком, которую вы сделали. Может ли это быть сопоставлено с конечным результатом, достигнутым, когда одно движение в одном направлении по сравнению с другим (я имею в виду, в конечном счете, цель обеих парадигм программирования состоит в том, чтобы иметь более простой и
понятный
0

* Я слышал это снова и снова, и я пытаюсь понять и подтвердить идею, что FP и OO ортогональны. *

Прежде всего, что означает, что 2 понятия являются ортогональными?

Цитата из Википедии: «Ортогональность гарантирует, что изменение технического эффекта, создаваемого компонентом системы, не создает и не распространяет побочные эффекты на другие компоненты системы».

Просто это означает, что изменение одной системы не влияет и не может повлиять на изменение другой системы.

Например, автомобиль имеет ортогональные компоненты и элементы управления (например, ускорение транспортного средства не влияет ни на что другое, кроме компонентов, связанных исключительно с функцией ускорения. Например, это не влияет на радио (хотя я не уверен, влияет ли это на воспроизведение CD, так как мой иногда пропускает)).

FP поощряет неизменность и чистоту в максимально возможной степени. и ОО кажется чем-то, что построено для состояния и мутации (слегка организованная версия императивного программирования?). И я понимаю, что объекты могут быть неизменными. Но ОО, кажется, подразумевает состояние / изменение для меня.

Они кажутся противоположностями. Значит ли это, что они ортогональны?

Своего рода. Проблема заключается в том, что ни одно из этих понятий не имеет четкого определения. Но да, ты понял суть этого.

ладья
источник