- Czy JavaScript jest językiem funkcjonalnym? Wiem, że ma obiekty i można z nim również korzystać z OOP, ale czy jest to również język funkcjonalny, czy można go używać w ten sposób?
- Wiesz, w jaki sposób OOP stał się / wydaje się następną ewolucją w programowaniu, czy to oznacza, że „Funkcjonalne programowanie” jest kolejną ewolucją (Uwaga: to NIE jest monit o opinię, ale monit o odpowiedź opartą na faktach, a ta notatka jest więcej dla moderatorów niż współpracowników;)).
- Uczę się najlepiej na przykładach, może ktoś może pokazać wykonywanie tego samego zadania w sposób OOP, a następnie w sposób programowania funkcjonalnego, aby zrozumieć i porównać działanie programowania funkcjonalnego.
Szczerze mówiąc, nie do końca rozumiem „programowanie funkcjonalne”: P Porównywanie Javascript do programowania funkcjonalnego może być całkowicie niepoprawne.
Mówiąc prościej, programowanie funkcjonalne: czy jest to po prostu korzyść z abstracji ZA POMOCĄ korzystania z anonimowych funkcji?
A może to zbyt proste? W prosty sposób OOP jest zaletą abstrakcji poprzez obiekty, ale uważam, że jest to zbyt uproszczone, aby opisywać OOP.
Czy to dobry przykład programowania funkcjonalnego? ...
Przykład JavaScript OOP:
// sum some numbers
function Number( v )
{
this.val = v;
}
Number.prototype.add( /*Number*/ n2 )
{
this.val += n2.val;
}
Przykład programowania funkcjonalnego:
function forEach(array, action)
{
for (var i = 0; i < array.length; i++)
action(array[i]);
}
function add(array)
{
var i=0;
forEach(array, function(n)
{
i += n;
});
return i;
}
var res = add([1,9]);
Or is that way too simple?
Tak jest. Anonimowe funkcje są czasem kojarzone z językami funkcjonalnymi i językami wieloparadygmatowymi, które sprzyjają programowaniu funkcjonalnemu, ale nie są unikalną cechą języków funkcjonalnych. Ale jeśli postrzegasz je jako implementację rachunku λ, to są one podstawową częścią programowania funkcjonalnego, a główną kwestią jest to, że nie jest to takie proste :)I know it has objects & you can do OOP with it also
Nie możesz Jest to programowanie prototypowe, które eliminuje rozróżnienie między klasą a obiektem. Osobiście uważam, że programowanie prototypowe jest wadliwe na tym podstawowym poziomie.Odpowiedzi:
Czasami ludzie powiedzą programowanie funkcjonalne, gdy mają na myśli programowanie imperatywne lub programowanie proceduralne . Ściśle mówiąc, programowanie funkcjonalne to:
Chociaż Javascript nie jest powszechnie znany ani używany jako język funkcjonalny, zawiera on pewne elementy funkcjonalne :
Schemat jest dialektem Lispa i prawdopodobnie jednym z języków, o których myśli większość programistów, omawiając programowanie funkcjonalne. Jeśli chodzi o orientację obiektową , JavaScript jest językiem zorientowanym obiektowo. Ale jego orientacja obiektowa opiera się na prototypach :
Więc chociaż JavaScript jest zorientowany obiektowo, nie jest zgodny z bardziej powszechnym modelem opartym na klasach , podobnie jak języki takie jak C ++, C #, Java i PHP (i kilka innych). I oczywiście jest to także język imperatywny, co prowadzi do pomylenia z funkcjonalnym programowaniem, które opisałem powyżej.
Orientacja obiektowa i programowanie funkcjonalne to tylko dwa z wielu różnych paradygmatów programowania , są to różne style programowania z różnymi koncepcjami i abstrakcjami. Kluczowym słowem jest „inny”. Nie ma jednego paradygmatu, który byłby lepszy od innych lub bardziej rozwinięty niż inne, każdy z nich pasuje do niektórych scenariuszy lepiej niż inne. Niektóre mogą być nieco starsze niż inne, ale pod względem ewolucyjnym czyni je lepszymi, ponieważ przetrwały dłużej. Ale to nie jest zbyt mądry sposób patrzenia na to.
JavaScript, jak opisałem powyżej i jako kilka innych języków, jest wieloparadygmatyczny. Umożliwia pisanie kodu w imperatywnym, obiektowym i funkcjonalnym stylu opartym na prototypach. Od Ciebie zależy, który najlepiej pasuje do tego, co budujesz. Istnieje również kilka pojedynczych języków paradygmatu, kanonicznym przykładem jest Java, która pozwala tylko na programowanie obiektowe zorientowane klasowo 1 .
Naprawdę powinieneś oprzeć się wszelkiej potrzebie traktowania języków i paradygmatów jako oświadczeń o modzie. Jest tam mnóstwo bzdur, napisanych głównie przez fanów / fanów lub marketingowców, z niewielką (jeśli w ogóle) wiedzą i zrozumieniem programowania. Terminy takie jak „lepszy”, „bardziej rozwinięty” itp. Po prostu nie mają zastosowania.
To byłby okropny sposób na naukę. Orientacja funkcjonalna i obiektowa to całkiem różne style, a żaden inny przykład, niż strasznie prosty, nie pasowałby do jednego lub drugiego stylu.
1 Ale ostatnio próbuje rozszerzyć swój zakres na programowanie ogólne, zobaczmy, jak to pójdzie.
Podsumowując:
źródło
JavaScript może być używany jako język funkcjonalny, w rzeczywistości robi to całkiem dobrze. Możliwe jest zaimplementowanie monad z obsługą konstrukcji lambda itp. Nie jest to wyłącznie język funkcjonalny, ponieważ ma również wiele cech obiektowych, ale można go w ten sposób wykorzystać. Właściwie uważam, że używanie Javascript jako języka funkcjonalnego to świetny sposób na jego użycie. (Przykład jQuery i underscore.js)
źródło
Ewolucja zwykle oznacza stopniową zmianę. OOP nie jest przyrostowym dodatkiem do programowania proceduralnego - w rzeczywistości jest całkowicie ortogonalny w stosunku do podstawowego modelu programowania i może być łączony z dowolnym z nich. Programowanie funkcjonalne nie jest przyrostowym dodatkiem do procedur, OOP itp. - jest alternatywną podstawą do wyrażenia podstawowych zasad obliczeniowych i jest tak naprawdę pierwszą taką podstawą sformułowaną na długo przed pojawieniem się pierwszych komputerów. Ważne jest, aby zrozumieć, że wszystkie takie podstawowe systemy są równoważne (tzn. Jeden można wyrazić w kategoriach innego).
Aby zrozumieć funkcjonalne podejście, musisz najpierw zdobyć podstawową matematykę . Jeśli chcesz poczuć, co to znaczy kodować w funkcjonalnym stylu w Javascript, zacznij używać jQuery .
źródło
Nie.
JavaScript jest przede wszystkim językiem obiektowym.
Nie oznacza to, że nie możesz pisać programów JavaScript w funkcjonalnym stylu, ponieważ możesz zaadaptować funkcjonalny styl w dowolnym języku Turinga, jeśli spróbujesz wystarczająco mocno. Jeśli chcesz, możesz programować funkcjonalnie w asemblerze. Ale to nie sprawia, że każdy język działa. Równie dobrze możesz nazwać imperatyw Haskella, lub Javę logicznym językiem programowania - jeśli zastosujesz takie podejście, warunki wkrótce staną się bez znaczenia.
IMO sposobem na zaklasyfikowanie języka do odpowiedniego paradygmatu jest rozważenie:
Osobiście uważam za dość zabawne, że wiele osób lubi twierdzić, że język jest „funkcjonalny” tylko dlatego, że jest to obecnie modny termin :-)
Jeśli chcesz mieć nieco długą, ale zabawną perspektywę programowania paradygmatów na przestrzeni lat, warto obejrzeć wideo wujka Boba Martina „The Last Programming Language” . Dla mnie świetnym spostrzeżeniem z tej rozmowy było to, że paradygmaty programowania są definiowane przez to, jakie funkcje zabierają , a nie jakie wprowadzają ......
źródło
What is the dominant style enabled by the language constructs
Wyzywam cię, byś spróbował zastosować to do Perla ... Albo jakikolwiek inny z twoich punktów, naprawdę :)JavaScript jest najpierw prototypowy, z funkcjami funkcjonalnymi - przyznawanymi przez wykorzystanie funkcji jako obiektów pierwszej klasy.
Oznacza to, że możesz używać funkcji jako danych, co ma dziwny efekt, ponieważ zmniejsza zapotrzebowanie na zmienne utrzymujące stan. Jeśli zauważysz, że sięgasz po instrukcję var lub korzystasz z jednej lub więcej instrukcji „if”, to zbłądzisz ze stylu funkcjonalnego.
Inną godną uwagi cechą stylu funkcjonalnego jest to, że funkcje powinny WYŁĄCZNIE zwracać wynik ich oceny i nie powinny mieć żadnych skutków ubocznych dla stanu poza ich zakresem:
Języki funkcjonalne są nieniszczące - co oznacza, że nie mutują danych wejściowych, ale zwracają całkowicie nowe dane na podstawie danych wejściowych. Zobacz ten wątek: https://stackoverflow.com/questions/749084/jquery-map-vs-each
Języki funkcjonalne mają również wiele wspólnych metod - o nazwach takich jak „mapa”, „fold”, „zmniejsz” przetwarzających listy / kolekcje. W JS, w przeciwieństwie do innych języków, musimy ręcznie je uporządkować, aby zobaczyć przykłady - zobacz biblioteki takie jak underscore.js , chociaż najnowsza implementacja JS ma kilka z nich od razu po wyjęciu z pudełka.
Ważną rzeczą do zapamiętania (IMO) jest to, że chociaż JS może wykorzystywać pewne wzorce funkcjonalne, nie zawsze jest on odpowiednio przygotowany do wykonania.
Weźmy na przykład iterację po tablicy. Możesz to zrobić za pomocą stylu funkcjonalnego lub rodzimej konstrukcji pętli - i ogólnie mówiąc, pętla jest bardziej wydajna. Weź ten przykład - uderz go w pętle o coraz większym rozmiarze i zapisz czasy wykonania w różnych przeglądarkach (już to zrobiłem, ale straciłem testy - przepraszam!):
Ponadto, jeśli używasz funkcjonalnej konstrukcji do uderzania w pętle o znacznych rozmiarach i nie korzystasz z jakiejś formy zarządzania stosami ad-hoc, możesz zalać stos (chociaż, żeby być uczciwym, potrzebujesz DUŻEJ listy, aby do tego doszło. ..). Musisz również uwzględnić różne warianty optymalizacji w każdej przeglądarce - chociaż jeśli pracujesz w środowisku Node.js, jest to oczywiście bardziej stały cel.
Nie oznacza to, że nie powinieneś używać funkcjonalnych konstrukcji w JavaScript - po prostu miej świadomość ograniczeń w implementacji w stosunku do środowiska.
Oto kilka linków, które mogą Cię zainteresować:
Dobry rozdział na temat programowania funkcjonalnego w JavaScript ze wspaniałego „Eloquent Javascript”
Mały Schemer
mój przyjaciel napisał bibliotekę JS opartą na Little Schemer
Dobry samouczek na temat Schematu, który może pomóc lepiej zrozumieć FP
źródło