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


13

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

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

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

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

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


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 .


1
«Это означает, что эти два понятия не имеют противоположных идей или не несовместимы друг с другом». - Это правда, но я думаю, что сказал бы что-то вроде « отчетливый, но не несовместимый». Например, если бы одно было подмножеством другого, то они не были бы несовместимыми, но они также не были бы ортогональными.
— Тим Гудман

@Tim: Это была моя [возможно, неудачная] попытка определить термин. Видите ли, я не английский гуру. : - |
— фактор

7

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

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


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

@TimGoodman: Мне очень понравилась ось x, y на аналогии с графиком, которую вы сделали. Может ли это быть сопоставлено с конечным результатом, достигнутым, когда одно движение в одном направлении по сравнению с другим (я имею в виду, в конечном счете, цель обеих парадигм программирования состоит в том, чтобы иметь более простой и
— понятный

0

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

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

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.