Autor: 24.11.2022
Programowanie funkcyjne - na czym to polega?
Ostatnio dużo się mówi o programowaniu funkcyjnym. Na czym więc polega główna idea funkcyjnego podejścia?
Głównym blokiem budującym program są funkcje. Ważne jest to, aby funkcje spełniały kilka kluczowych warunków.
Przede wszystkim każda funkcja powinna robić tylko jedną rzecz. W dużym skrócie funkcję można by opisać prostym schematem: dane wejściowe -> przetworzenie danych -> dane wyjściowe.
Oczywiście pojedyncza funkcje, która odpowiada za jedną operację, wiele nam nie pomoże. Cała idea polega na tym aby zastosować tzw. kompozycję. Po prostu bierzemy dane zwrócone przez jedną funkcję i przekazujemy je jako dane wejściowe do kolejnej funkcji.
Takie podejście do pisania kodu ma pewne zalety. Dzięki temu, że pracujemy z prostymi funkcjami wykonującymi pojedyncze operacje, to możemy nasz kod łatwo testować. Każdą funkcję da się łatwo wyizolować aby przetestować poprawność wykonywanych przez nią operacji.
Możemy też łatwo komponować większe bloki programu z pojedynczych funkcji. To z kolei daje nam możliwość wielokrotnego wykorzystania napisanych przez nas funkcji.
Czasami mówi się o tym, że podejście funkcyjne pozwala pisać kod w sposób deklaratywny. Chodzi po prostu o to, że możemy się skupić bardziej na tym co chcemy osiągnąć niż na krokach prowadzących do rozwiązania problemu. Bardziej interesuje nas wynik niż sposób osiągnięcia tego wyniku. Używając prostych funkcji do tworzenia kodu wyraźnie “deklarujemy” co chcemy osiągnąć. Ma to też dodatkowe plusy w postaci bardziej czytelnego i zrozumiałego kodu.
Java Developer
Java to sprawdzony, niezawodny i bardzo rozpowszechniony język programowania.Ta ścieżka kariery sprawi, że staniesz się pełnoprawnym kandydatem na Java Developera. Ścieżka zawiera dziesiątki zadań, ćwiczeń oraz projektów, które nauczą cię realnych, przydatnych na rynku pracy umiejętności. Dowiedz się więcej
Programowanie funkcyjne w różnych językach
W praktyce funkcyjne podejście może być używane w różnych językach programowania. Większość popularnych języków umożliwia pisanie kodu w oparciu o różne podejścia: obiektowe, funkcyjne itp. To od ciebie zależy, z którego podejścia skorzystasz.
Są też języki, które niejako wymuszają funkcyjne podejście np. Haskell. Z tym, że mówimy tu raczej o językach niszowych. W praktyce funkcyjne podejście jest możliwe do zrealizowania w każdym popularnym języku: Java, JavaScript, PHP, C# itp.
Mechanizmy programowania funkcyjnego
Programowanie funkcyjne opiera się na pewnych specyficznych mechanizmach. Trzeba dobrze je zrozumieć jeśli chcesz zastosować funkcyjne podejście w tworzonym przez ciebie kodzie. Popatrzmy teraz na kilka przykładowych idei.
Funkcje czyste
Wspomnieliśmy o tym, że programowanie funkcyjne opiera się na tworzeniu oraz wykorzystaniu funkcji, które wykonują pojedynczą operację. Często mówi się, że to powinny być “funkcje czyste”. Takie funkcje mają pewne charakterystyczne cechy.
- Wynik działania takiej funkcji zależy tylko od parametrów wejściowych.
- Dla tych samych parametrów wejściowych funkcja zawsze zwróci ten sam wynik.
- Funkcja czysta nie posiada tzw. efektów ubocznych. Nie modyfikuje wartości globalnych, jej wynik nie jest zależny od zewnętrznych czynników, nad którymi nie mamy pełnej kontroli.
Spójrz na prosty przykład:
function add(a, b) {
return a + b;
}
Mamy funkcję, która przyjmuje dwa parametry wejściowe i zwraca ich sumę. Funkcja nie modyfikuje żadnych zmiennych, które znajdują się poza funkcją. Jej wynik jest zależny tylko od wartości parametrów wejściowych. To jest właśnie funkcja czysta.
Kompozycja
O kompozycji już trochę pisaliśmy wcześniej. Chodzi o to, że możemy łączyć proste, czyste funkcje w większe bloki. Możemy po kolei przekazywać wartości z jednej funkcji do kolejnej funkcji w celu uzyskania pożądanego rezultatu.
Inne mechanizmy
Temat programowania funkcyjnego jest szeroki. Jest sporo mechanizmów, o których śmiało moglibyśmy napisać oddzielne artykuły. Mówimy tu o technikach znanych jako partial application czy currying.
PHP Developer
Zdobądź umiejętności niezbędne do pracy jako PHP Developer. Ta ścieżka kariery sprawi, że staniesz się pełnoprawnym kandydatem na PHP Developera. Ścieżka zawiera dziesiątki zadań, ćwiczeń oraz projektów, które nauczą cię realnych, przydatnych na rynku pracy umiejętności. Dowiedz się więcej
Przykład - mapowanie
Technika znana jako map to dobry przykład mechanizmu programowania funkcyjnego. Załóżmy, że mamy listę wartości i każdą z tych wartości chcemy podnieść do kwadratu. Oto nasz prosty przykład:
let digits = [ 1, 2, 4, 5, 8 ];
let squares = digits.map(digit => digit * digit);
Wykorzystaliśmy możliwości jakie oferuje język JavaScript. Funkcja map() pozwala wykonać identyczną operację na każdym elemencie listy/tablicy. Operacja, które nas interesuje to podnoszenie do kwadratu czyli digit => digit * digit. Wynik operacji to przetworzona lista wartości:
[ 1, 4, 16, 25, 64 ]
Zauważ, że uzyskaliśmy prosty, czytelny kod. To jest kod bardzo deklaratywny. Deklarujemy to, co chcemy osiągnąć czyli wartości podniesione do kwadratu. Unikamy jednocześnie pisania złożonych pętli czy innych trudnych do przeanalizowania mechanizmów. To prosty i dość obrazowy przykład użycia funkcyjnego podejścia w kodzie.
Praktyczne zastosowania
Na koniec porozmawiajmy trochę o realnych zastosowaniach programowania funkcyjnego.
To podejście jest po prostu alternatywą dla innych podejść. Niemal każdy program da się napisać w sposób funkcyjny, choć nie zawsze ma to sens. Generalnie w ostatnich latach mamy wyraźny wzrost popularności programowania funkcyjnego. Wkracza ono nawet do języków, które od zawsze bazowały na innych podejściach.
Z funkcyjnym programowaniem dość często możesz się spotkać na przykład w świecie JavaScript. Niezliczona ilość aplikacji pisanych w tym języku jest oparta właśnie o podejście funkcyjne. Tutaj warto wymienić chociażby bardzo popularny framework React. To tylko jeden z wielu przykładów bo tak jak wspominaliśmy przed chwilą, popularność programowania funkcyjnego w ostatnich latach wyraźnie rośnie.