Я слышал это снова и снова, и я пытаюсь понять и подтвердить идею, что FP и OO ортогональны.
Прежде всего, что означает, что 2 понятия являются ортогональными?
FP поощряет неизменность и чистоту в максимально возможной степени. и ОО кажется чем-то, что построено для состояния и мутации (слегка организованная версия императивного программирования?). И я понимаю, что объекты могут быть неизменными. Но ОО, кажется, подразумевает состояние / изменение для меня.
Они кажутся противоположностями. Значит ли это, что они ортогональны?
Такой язык, как Scala, позволяет легко использовать как OO, так и FP, влияет ли это на ортогональность двух методов?
Ответы:
Термин «ортогональный» происходит от математики, где он имеет синоним «перпендикулярно». В этом контексте вы можете понять это как «две вещи не имеют ничего общего друг с другом».
Когда люди сравнивают FP и OO, они часто путают две разные оси.
С одной стороны, у вас есть функциональное программирование по сравнению с императивным программированием. Джонас дает хорошее сравнение двух. Версия с одним предложением говорит, что «поток данных против потока управления».
Другая ось - абстракция данных. Такие языки, как Haskell, используют абстрактные типы данных для абстрактных данных. Smalltalk использует объекты, которые объединяют данные и операции над этими данными в единый блок. Уильям Кук объясняет лучше, чем я, в своей статье « Понимание абстракции данных» .
Совершенно понятно, что большинство людей в конечном итоге думают, что FP и OO являются противоположностями: большинство языков OO являются обязательными, поэтому, если вы сравните, скажем, Haskell и Java, у вас будет поток данных + ADT против потока управления + объект. Но есть и другие возможности! Матиас Феллайзен объясняет, как счастливо жениться на ФП и ОО в своем выступлении « Функциональные объекты» .
источник
Это означает, что эти два понятия не имеют противоположных идей или не являются несовместимыми друг с другом.
ОО - это инкапсуляция, состав объектов, абстракция данных, полиморфизм посредством подтипирования и контролируемая мутация, когда это необходимо (неизменность также поддерживается в ОО). FP - это композиция функций, управляющая абстракция и ограниченный полиморфизм (он же параметрический полиморфизм). Таким образом, две идеи не противоречат друг другу. Они оба предоставляют вам различные виды полномочий и механизмов абстракции, которые, безусловно, можно использовать на одном языке. На самом деле, это тезис, на котором была построена Scala !
В своем выступлении в Scala Experiment в Google Мартин Одерски очень хорошо объясняет, как он считает, что две концепции - OO и FP - ортогональны друг другу и как Scala элегантно и плавно объединяет две парадигмы в новую парадигму, широко известную в сообществе Scala как объектно-функциональная парадигма. Должен смотреть разговор за вас. :-)
Другие примеры объектно-функциональных языков: OCaml , F # , Nemerle .
источник
Ортогональный примерно означает «независимый».
Таким образом, если FP и OO ортогональны, это означает, что вы можете использовать неизменяемость независимо от того, используете вы объекты или нет, и вы можете использовать объекты независимо от того, являются ли они неизменяемыми или нет.
источник
* Я слышал это снова и снова, и я пытаюсь понять и подтвердить идею, что FP и OO ортогональны. *
Прежде всего, что означает, что 2 понятия являются ортогональными?
Цитата из Википедии: «Ортогональность гарантирует, что изменение технического эффекта, создаваемого компонентом системы, не создает и не распространяет побочные эффекты на другие компоненты системы».
Просто это означает, что изменение одной системы не влияет и не может повлиять на изменение другой системы.
Например, автомобиль имеет ортогональные компоненты и элементы управления (например, ускорение транспортного средства не влияет ни на что другое, кроме компонентов, связанных исключительно с функцией ускорения. Например, это не влияет на радио (хотя я не уверен, влияет ли это на воспроизведение CD, так как мой иногда пропускает)).
FP поощряет неизменность и чистоту в максимально возможной степени. и ОО кажется чем-то, что построено для состояния и мутации (слегка организованная версия императивного программирования?). И я понимаю, что объекты могут быть неизменными. Но ОО, кажется, подразумевает состояние / изменение для меня.
Они кажутся противоположностями. Значит ли это, что они ортогональны?
Своего рода. Проблема заключается в том, что ни одно из этих понятий не имеет четкого определения. Но да, ты понял суть этого.
источник