Ортогональний FP і OO?


13

Я чув це раз і знову, і я намагаюся зрозуміти і підтвердити думку про те, що ПС і ОО є ортогональними.

Перш за все, що означає ортогональність двох понять?

ПП максимально заохочує незмінність та чистоту. і ОО здається чимось, що побудовано для стану та мутації (злегка організована версія імперативного програмування?). І я розумію, що предмети можуть бути незмінні. Але OO, здається, означає для мене стан / зміни.

Вони здаються протилежними. Чи означає це, що вони ортогональні?

Мова на зразок Scala полегшує виконання OO та FP, чи це впливає на ортогональність двох методів?


5
Орієнтація на об'єкт не вимагає від об'єктів маніпулювання його станом. Методи можуть повернути нові об’єкти як результати. Те, що можна, а часто і змінювати стан об'єкта, не означає, що їм це потрібно чи що це гарна ідея. ОО та ФП - не протилежності.
Хупернікетес

4
Дублікат на stackoverflow: ортогональний FP та OO?
sepp2k

Відповіді:


22

Термін "ортогональний" походить від математики, де він має синонім: "перпендикуляр". У цьому контексті ви могли б зрозуміти це як "дві речі не мають нічого спільного".

Коли люди порівнюють FP і OO, вони часто плутають дві окремі осі.

З одного боку, у вас функціональне програмування проти імперативного програмування. Йонас дає хороше порівняння двох. Версія в одному реченні говорить про те, що "потік даних проти контрольного потоку".

Інша вісь - абстрагування даних. Такі мови, як Haskell, використовують абстрактні типи даних для, ну, абстрактних даних. Smalltalk використовує об'єкти, які об'єднують дані та операції над цими даними в єдине ціле. Вільям Кук пояснює краще, ніж я міг у своїй роботі « Розуміння абстракції даних», переглянута .

Цілком зрозуміло, що більшість людей в кінцевому рахунку думають, що FP і OO є протилежністю: більшість мов OO є обов'язковими, тому, якщо порівнювати, скажімо, Haskell і Java, у вас є потік даних + ADT проти управління flow + об'єкт. Але є й інші можливості! Маттіас Феллейзен пояснює, як щасливо одружитися з ФП та ОО у своїх розмовних функціональних об'єктах .


+1, чудова відповідь. Ваша відповідь відсутня на типових класах Haskell.
зниклий фактор

Точно. Я тільки лише почав фактично вивчати Haskell.
Френк Ширар

Цікаво, чи є запис цієї презентації функціональних об'єктів ... Мені дуже цікаво, але самі слайди насправді це не справедливо.
Rei Miyasaka

9

Перш за все, що означає ортогональність двох понять?

Це означає, що обидві концепції не мають контрастних ідей або не несумісні між собою.

ПП максимально заохочує незмінність та чистоту. і ОО здається чимось, що побудовано для стану та мутації (злегка організована версія імперативного програмування?). І я розумію, що предмети можуть бути незмінні. Але OO, здається, означає для мене стан / зміни.

Вони здаються протилежними. Як це впливає на їх ортогональність?

Мова на зразок Scala полегшує виконання OO та FP, чи це впливає на ортогональність двох методів?

OO - це інкапсуляція, склад об'єкта, абстрагування даних, поліморфізм за допомогою підтипу і керована мутація, коли це необхідно (незмінність також рекомендується в OO). ПП - це склад функції, контрольна абстракція та обмежений поліморфізм (він же параметричний поліморфізм). Таким чином, дві ідеї не суперечать один одному. Вони обидва надають вам різного роду повноваження та механізми абстрагування, які, безумовно, можливо мати однією мовою. Насправді, це теза, на якій будувалася Скала !

У своїй розмові про експеримент Scala в Google, Мартін Одерський дуже добре пояснює, як він вважає, що два поняття - OO і FP - є ортогональними одне одному, і як Scala об'єднує дві парадигми елегантно і безперешкодно в нову парадигму, широко відому в громаді Scala як об’єктно-функціональна парадигма. Треба дивитись, щоб говорити за вас. :-)


Інші приклади об'єктно-функціональних мов: OCaml , F # , Nemerle .


1
"Це означає, що обидві концепції не мають контрастних ідей або не є несумісними один з одним". - Це правда, але я думаю, я б сказав щось на кшталт " чіткого, але не несумісного". Наприклад, якби одне було підмножиною іншого, то вони не були б несумісними, але вони також не були б ортогональними.
Тім Гудман

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

7

Ортогонально приблизно означає «незалежний».

Отже, якщо FP і OO є ортогональними, це означає, що ви можете використовувати незмінність, використовуючи ви об'єкти чи ні, і ви можете використовувати об'єкти, непорушні вони чи ні.


2
"Незалежний" - це хороший спосіб викласти це. Справа не в тому, що вони протилежні, а чи є ваш код функціональним стилем програмування або об'єктно-орієнтованим стилем програмування - це дві окремі речі. Думайте про них, як осі x та y на графіку - ви можете рухатись вгору та вниз по одній, залишаючись нерухомою на іншій. (У математичному сенсі вектор у напрямку x і вектор у напрямку y є буквально ортогональними - пов'язане визначення CS.)
Тім Гудман

@TimGoodman: Мені дуже сподобалася вісь x, y на аналогії графіка, яку ви зробили. Чи можна це відобразити до кінцевого результату, досягнутого, коли один крок в один бік проти іншого (я маю на увазі, мета парадигми програмування - мати простіший і доступний код, чи не так?)
rahulaga_dev

0

* Я чув це раз і знову, і я намагаюся зрозуміти і підтвердити думку про те, що FP і OO є ортогональними. *

Перш за все, що означає ортогональність двох понять?

Цитата Вікіпедії: "Ортогональність гарантує, що модифікація технічного ефекту, що створюється компонентом системи, не створює і не поширює побічні ефекти для інших компонентів системи".

Просто це просто означає, що зміна в одній системі не має і не може вплинути на зміну в іншій системі.

Наприклад, автомобіль має ортогональні компоненти та елементи управління (наприклад, прискорення транспортного засобу не впливає ні на що інше, але на компоненти, що беруть участь виключно з функцією прискорення. Це не впливає, наприклад, на радіо (хоча я не впевнений, чи впливає це на відтворення компакт-дисків, оскільки мій часом пропускає)).

ПП максимально заохочує незмінність та чистоту. і ОО здається чимось, що побудовано для стану та мутації (злегка організована версія імперативного програмування?). І я розумію, що предмети можуть бути незмінні. Але OO, здається, означає для мене стан / зміни.

Вони здаються протилежними. Чи означає це, що вони ортогональні?

Свого роду. Проблема полягає в тому, що жодна з цих концепцій насправді не визначена важко. Але так, ви зрозуміли суть цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.