Czym jest programowanie funkcyjne? Samouczek z przykładem
Co to jest programowanie funkcjonalne?
Programowanie funkcyjne (nazywane również FP) to sposób myślenia o konstrukcji oprogramowania poprzez tworzenie czystych funkcji. Unika koncepcji współdzielonego stanu, zmiennych danych obserwowanych w programowaniu obiektowym.
Języki funkcjonalne kładą nacisk na wyrażenia i deklaracje, a nie na wykonywanie instrukcji. Dlatego w przeciwieństwie do innych procedur zależnych od stanu lokalnego lub globalnego, wartość wyjściowa w FP zależy tylko od argumentów przekazanych do funkcji.
Charakterystyka programowania funkcyjnego
- Metoda programowania funkcjonalnego koncentruje się na wynikach, a nie na procesie
- Nacisk kładziony jest na to, co należy obliczyć
- Dane są niezmienne
- Programowanie funkcjonalne Rozłóż problem na „funkcje”.
- Opiera się na koncepcji funkcji matematycznych, które do wykonania obliczeń wykorzystują wyrażenia warunkowe i rekurencję
- Nie obsługuje iteracji, takich jak instrukcje pętlowe i instrukcje warunkowe, takie jak If-Else
Historia programowania funkcjonalnego
- Podstawą programowania funkcyjnego jest rachunek lambda. Został on opracowany w latach 1930. XX wieku do zastosowań funkcyjnych, definicji i rekurencji.
- LISP był pierwszym funkcjonalnym językiem programowania. McCarthy zaprojektował go w 1960 roku
- Pod koniec lat 70-tych naukowcy z Uniwersytetu w Edynburgu zdefiniowali ML (Meta Language)
- We wczesnych latach 80-tych język Hope dodaje algebraiczne typy danych na potrzeby rekurencji i wnioskowania równań
- W roku 2004 innowacja języka funkcyjnego „Scala”.
Funkcjonalne języki programowania
Celem każdego języka FP jest naśladowanie funkcji matematycznych. Jednak podstawowy proces obliczeń jest inny w programowaniu funkcjonalnym.
Oto kilka najbardziej znanych języków programowania funkcjonalnego:
- Haskell
- SML
- Clojure
- Scala
- Erlang
- Czyszczenie
- F#
- ML/OCaml Lisp / Schemat
- XSLT
- SQL
- Matematyka
Podstawowa terminologia programowania funkcjonalnego i Concepts
Niezmienne dane
Niezmienne dane oznaczają, że powinieneś łatwo tworzyć struktury danych zamiast modyfikować te, które już istnieją.
Przejrzystość referencyjna
Programy funkcyjne powinny wykonywać operacje tak, jakby były wykonywane po raz pierwszy. Dzięki temu będziesz wiedział, co mogło lub nie mogło się wydarzyć podczas wykonywania programu, a także jakie są tego skutki uboczne. W terminologii FP nazywa się to przezroczystością referencyjną.
Modułowość
Modułowa konstrukcja zwiększa produktywność. Małe moduły można szybko zakodować i mają większą szansę na ponowne wykorzystanie, co z pewnością prowadzi do szybszego rozwoju programów. Oprócz tego moduły można testować osobno, co pomaga skrócić czas spędzony na testowaniu jednostkowym i debugowaniu.
Łatwość utrzymania
Konserwowalność to prosty termin, który oznacza, że programowanie FP jest łatwiejsze w utrzymaniu, ponieważ nie trzeba się martwić o przypadkową zmianę czegokolwiek poza daną funkcją.
Funkcja pierwsza klasa
„Funkcja pierwszej klasy” to definicja przypisana jednostkom języka programowania, które nie mają żadnych ograniczeń w ich użyciu. Dlatego pierwszorzędne funkcje mogą pojawić się w dowolnym miejscu programu.
Zamknięcie
Zamknięcie jest funkcją wewnętrzną, która może uzyskać dostęp do zmiennych funkcji nadrzędnej, nawet po wykonaniu funkcji nadrzędnej.
Funkcje wyższego rzędu
Funkcje wyższego rzędu albo przyjmują inne funkcje jako argumenty, albo zwracają je jako wyniki.
Funkcje wyższego rzędu umożliwiają częściowe zastosowanie lub curry. Technika ta stosuje funkcję do jej argumentów pojedynczo, ponieważ każda aplikacja zwraca nową funkcję, która akceptuje następny argument.
Czysta funkcja
„Funkcja czysta” to funkcja, której dane wejściowe są zadeklarowane jako dane wejściowe i żadne z nich nie powinno być ukryte. Wyjścia są również deklarowane jako wyjścia.
Funkcje czyste działają na swoje parametry. Nie jest efektywne, jeśli nic nie zwraca. Co więcej, oferuje taką samą moc wyjściową dla danych parametrów
Przykład:
Function Pure(a,b) { return a+b; }
Nieczyste funkcje
Nieczyste działa dokładnie odwrotnie niż czyste. Mają ukryte wejścia lub wyjścia; nazywa się to nieczystym. Nieczystych funkcji nie można używać ani testować w izolacji, ponieważ mają one zależności.
Przykład
int z; function notPure(){ z = z+10; }
Skład funkcji
Składanie funkcji polega na łączeniu 2 lub więcej funkcji w celu utworzenia nowej.
Wspólne Stany
Stany wspólne to koncepcja ważna w programowaniu OOP. Zasadniczo polega na dodawaniu właściwości do obiektów. Na przykład, jeśli dysk twardy jest obiektem, jako właściwości można dodać pojemność pamięci i rozmiar dysku.
Skutki uboczne
Skutki uboczne to wszelkie zmiany stanu, które występują poza wywoływaną funkcją. Największym celem każdego języka programowania FP jest minimalizacja skutków ubocznych poprzez oddzielenie ich od reszty kodu oprogramowania. W programowaniu FP Ważne jest, aby usunąć skutki uboczne z reszty logiki programowania.
Korzyści z programowania funkcyjnego
- Pozwala uniknąć mylących problemów i błędów w kodzie
- Łatwiejsze testowanie i wykonywanie testów jednostkowych oraz debugowanie kodu FP.
- Przetwarzanie równoległe i współbieżność
- Wdrażanie gorącego kodu i odporność na błędy
- Oferuje lepszą modułowość przy krótszym kodzie
- Zwiększona produktywność programisty
- Obsługuje funkcje zagnieżdżone
- Konstrukcje funkcjonalne, takie jak leniwa mapa i listy itp.
- Umożliwia efektywne wykorzystanie rachunku lambda
Ograniczenia programowania funkcjonalnego
- Paradygmat programowania funkcjonalnego nie jest łatwy, przez co jest trudny do zrozumienia dla początkującego
- Trudno utrzymać, ponieważ wiele obiektów ewoluuje podczas kodowania
- Wymaga dużo drwin i rozbudowanej konfiguracji środowiska
- Ponowne użycie jest bardzo skomplikowane i wymaga ciągłej refaktoryzacji
- Obiekty mogą nie odzwierciedlać poprawnie problemu
Programowanie funkcjonalne a programowanie obiektowe
Programowanie funkcjonalne | OOP |
---|---|
FP używa niezmiennych danych. | OOP używa danych zmiennych. |
Postępuje zgodnie z modelem opartym na programowaniu deklaratywnym. | Stosuje model programowania imperatywnego. |
Na czym się skupia: „Co robisz. w programie.” | Koncentruje się na „Jak programujesz”. |
Obsługuje programowanie równoległe. | Brak wsparcia dla programowania równoległego. |
Jego funkcje nie powodują skutków ubocznych. | Metoda może powodować wiele skutków ubocznych. |
Sterowanie przepływem odbywa się za pomocą wywołań funkcji i wywołań funkcji z rekurencją. | Proces kontroli przepływu realizowany jest za pomocą pętli i instrukcji warunkowych. |
Kolejność wykonywania instrukcji nie jest bardzo istotna. | Kolejność wykonywania instrukcji jest istotna. |
Obsługuje zarówno „Abstrakcję nad danymi”, jak i „Abstrakcję nad zachowaniem”. | Obsługuje tylko „Abstrakcję nad danymi”. |
Podsumowanie
- Programowanie funkcjonalne lub FP to sposób myślenia o budowie oprogramowania oparty na pewnych podstawowych zasadach definiujących
- Koncepcje programowania funkcjonalnego koncentrują się na wynikach, a nie na procesie
- Celem każdego języka FP jest naśladowanie funkcji matematycznych
- Niektóre najbardziej znane języki programowania funkcjonalnego: 1) Haskell 2) SM 3) Clojure 4) Scala 5) Erlang 6) Clean
- „Funkcja czysta” to funkcja, której dane wejściowe są zadeklarowane jako dane wejściowe i żadne z nich nie powinno być ukryte. Wyjścia są również deklarowane jako wyjścia.
- Niezmienne dane oznaczają, że powinieneś łatwo tworzyć struktury danych zamiast modyfikować te, które już istnieją
- Pozwala uniknąć mylących problemów i błędów w kodzie
- Kod funkcjonalny nie jest łatwy, przez co jest trudny do zrozumienia dla początkującego
- FP używa danych niezmiennych, podczas gdy OOP używa danych zmiennych