FP i OO ortogonalne?

13

Słyszałem to wiele razy i staram się zrozumieć i potwierdzić ideę, że FP i OO są ortogonalne.

Po pierwsze, co to znaczy, że 2 koncepcje są ortogonalne?

FP w jak największym stopniu zachęca do niezmienności i czystości. a OO wydaje się czymś zbudowanym dla stanu i mutacji (nieco zorganizowana wersja programowania imperatywnego?). I zdaję sobie sprawę, że przedmioty mogą być niezmienne. Ale OO wydaje mi się sugerować stan / zmianę.

Wyglądają jak przeciwieństwa. Czy to znaczy, że są ortogonalne?

Język taki jak Scala ułatwia wykonywanie zarówno OO, jak i FP, czy to wpływa na ortogonalność 2 metod?

letronje
źródło
5
Orientacja obiektowa nie wymaga, aby obiekty manipulowały jej stanem. Metody mogą zwracać nowe obiekty jako wyniki. Fakt, że można i często modyfikuje stan obiektu, nie oznacza, że ​​jest to konieczne lub że jest to dobry pomysł. OO i FP nie są przeciwieństwami.
Huperniketes
4
Duplikat przy przepełnieniu stosu: FP i OO ortogonalne?
sepp2k

Odpowiedzi:

22

Termin „ortogonalny” pochodzi z matematyki, gdzie ma synonim: „prostopadły”. W tym kontekście można to zrozumieć jako „te dwie rzeczy nie mają ze sobą nic wspólnego”.

Kiedy ludzie porównują FP i OO, często mylą dwie oddzielne osie.

Z jednej strony masz programowanie funkcjonalne a programowanie imperatywne. Jonas daje dobre porównanie tych dwóch. Wersja w jednym zdaniu mówi, że „przepływ danych a przepływ sterowania”.

Druga oś to abstrakcja danych. Języki takie jak Haskell używają abstrakcyjnych typów danych do, cóż, abstrakcyjnych danych. Smalltalk używa obiektów, które łączą dane i operacje na tych danych w jedną jednostkę. William Cook wyjaśnia lepiej niż ja w swoim artykule Zrozumienie abstrakcji danych, ponownie .

Jest całkowicie zrozumiałe, że większość ludzi myśli, że FP i OO są przeciwieństwami: większość języków OO jest imperatywna, więc jeśli porównasz, powiedzmy, Haskell i Java, masz przepływ danych + ADT w porównaniu do przepływu kontrolnego + obiektu. Ale są też inne możliwości! Matthias Felleisen wyjaśnia, jak szczęśliwie poślubić FP i OO w swoim przemówieniu Functional Objects .

Frank Shearar
źródło
+1, świetna odpowiedź. Twoja odpowiedź nie trafia jednak na typy Haskell.
missingfaktor
Na pewno. Ja tylko po prostu zaczął rzeczywiście nauka Haskell.
Frank Shearar
Zastanawiam się, czy jest jakieś nagranie z prezentacji obiektów funkcjonalnych ... Jestem naprawdę zainteresowany, ale same slajdy nie oddają tego sprawiedliwie.
Rei Miyasaka,
9

Po pierwsze, co to znaczy, że 2 koncepcje są ortogonalne?

Oznacza to, że te dwie koncepcje nie mają sprzecznych pomysłów lub nie są ze sobą niezgodne.

FP w jak największym stopniu zachęca do niezmienności i czystości. a OO wydaje się czymś zbudowanym dla stanu i mutacji (nieco zorganizowana wersja programowania imperatywnego?). I zdaję sobie sprawę, że przedmioty mogą być niezmienne. Ale OO wydaje mi się sugerować stan / zmianę.

Wyglądają jak przeciwieństwa. Jak wpływa to na ich ortogonalność?

Język taki jak Scala ułatwia wykonywanie zarówno OO, jak i FP, czy to wpływa na ortogonalność 2 metod?

W OO chodzi o enkapsulację, kompozycję obiektów, abstrakcję danych, polimorfizm poprzez podtypy i kontrolowaną mutację, gdy jest to konieczne (niezmienność jest również wspierana w OO). FP dotyczy kompozycji funkcji, kontroli abstrakcji i ograniczonego polimorfizmu (inaczej polimorfizmu parametrycznego). Zatem te dwie idee nie są sprzeczne. Oba zapewniają różne rodzaje mocy i mechanizmów abstrakcji, które z pewnością są możliwe w jednym języku. W rzeczywistości jest to teza, na której zbudowano Scalę !

W swoim przemówieniu na temat Scala Experiment w Google Martin Odersky bardzo dobrze wyjaśnia, w jaki sposób uważa, że ​​te dwie koncepcje - OO i FP - są do siebie ortogonalne oraz w jaki sposób Scala łączy oba paradygmaty elegancko i płynnie w nowy paradygmat znany w społeczności Scala jako: paradygmat obiektowo-funkcjonalny. Musisz uważać na rozmowę za ciebie. :-)


Inne przykłady języków obiektowo-funkcyjnych: OCaml , F # , Nemerle .

missingfaktor
źródło
1
„Oznacza to, że te dwie koncepcje nie mają sprzecznych pomysłów lub nie są ze sobą niezgodne”. - To prawda, ale myślę, że powiedziałbym coś w stylu „ wyraźny, ale niekompatybilny”. Na przykład, jeśli jeden byłby podzbiorem drugiego, nie byłyby niezgodne, ale nie byłyby również ortogonalne.
Tim Goodman
@Tim: To była moja [być może nieudana] próba zdefiniowania tego terminu. Widzisz, nie jestem angielskim guru. : - |
missingfaktor
7

Ortogonalny z grubsza oznacza „niezależny”.

Jeśli więc FP i OO są ortogonalne, oznacza to, że możesz użyć niezmienności, niezależnie od tego, czy używasz obiektów, czy nie, i możesz używać obiektów, niezależnie od tego, czy są one niezmienne.

Uwaga do samodzielnego wymyślenia imienia
źródło
2
„Niezależny” to dobry sposób na wyrażenie tego. Nie chodzi o to, że są przeciwieństwami, ale to, czy kod jest funkcjonalnym stylem programowania, czy obiektowym stylem programowania to dwie osobne rzeczy. Pomyśl o nich jak o osiach xiy na wykresie - możesz poruszać się w górę iw dół, pozostając nieruchomym na drugim. (W sensie matematycznym wektor w kierunku x i wektor w kierunku y są dosłownie ortogonalne - definicja CS jest powiązana.)
Tim Goodman,
@TimGoodman: Naprawdę podobała mi się twoja analogia osi x, y na wykresie. Czy można to odwzorować na ostateczny wynik osiągnięty, gdy jeden ruch w jednym kierunku w stosunku do drugiego (to znaczy ostatecznie celem paradygmatu programowania jest łatwiejszy i łatwiejszy do utrzymania kod, prawda?)
rahulaga_dev
0

* Słyszałem wiele razy i staram się zrozumieć i potwierdzić ideę, że FP i OO są ortogonalne. *

Po pierwsze, co to znaczy, że 2 koncepcje są ortogonalne?

Cytat z Wikipedii: „Ortogonalność gwarantuje, że modyfikacja efektu technicznego wytwarzanego przez element systemu nie powoduje ani nie rozprzestrzenia efektów ubocznych na inne elementy systemu”.

Po prostu oznacza to po prostu, że zmiana w jednym systemie nie ma wpływu i nie może wpłynąć na zmianę w innym systemie.

Na przykład samochód ma elementy ortogonalne i elementy sterujące (np. Przyspieszenie pojazdu nie ma wpływu na nic innego, ale elementy związane wyłącznie z funkcją przyspieszenia. Nie wpływa na przykład na radio (chociaż nie jestem pewien, czy wpływa to na odtwarzanie płyty CD, ponieważ moje czasami pomijają)).

FP w jak największym stopniu zachęca do niezmienności i czystości. a OO wydaje się czymś zbudowanym dla stanu i mutacji (nieco zorganizowana wersja programowania imperatywnego?). I zdaję sobie sprawę, że przedmioty mogą być niezmienne. Ale OO wydaje mi się sugerować stan / zmianę.

Wyglądają jak przeciwieństwa. Czy to znaczy, że są ortogonalne?

Trochę Problem polega na tym, że żadna z tych koncepcji nie jest naprawdę trudna do zdefiniowania. Ale tak, masz sedno tego.

Wieża
źródło