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?
Odpowiedzi:
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 .
źródło
Oznacza to, że te dwie koncepcje nie mają sprzecznych pomysłów lub nie są ze sobą niezgodne.
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 .
źródło
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.
źródło
* 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.
źródło