Jak uważacie, w jakich sytuacjach programowanie funkcyjne jest optymalnym paradygmatem do rozwoju oprogramowania?
Cokolwiek przeczytam w internecie na ten temat to bardziej artykuły podkreślą łatwiejsze rozwiązywanie problemów związanych z współbieżnością lub łatwiejszym analizowaniem kodu, bo w czystych funkcjach nie ma efektów ubocznych więc jest mniej okoliczności, gdzie coś może pójść nie tak po naszej myśli.
Ale to do mnie niezbyt przemawia, albo inaczej, to ukazuje FP w dość słabym świetle, jako niszowy i bardzo niepraktyczny paradygmat, ponieważ większość aplikacji nie ma problemów z współbieżnością chyba, że 1) używa się ram, które mają magię, której nie idzie łatwo zrozumieć i od której nie można uciec lub 2) używa zbyt ograniczonych baz, które nie obsługują transakcji w stopniu w jakim wymaga aplikacja.
Wystarczy mieć posgresql i stosować pewniejsze ramy lub nawet brak ram, a większość potencjalnych problemów jakie rozwiązuje FP wydaje się na pierwszy rzut oka niedostrzegalne i nie warte podjęcia wysiłku.
Głowiłem się nie raz po co używać FP, tym bardziej gdy w komercyjnym projekcie pewne rzeczy się wykluczają jak np. używanie FP i postgresql. Tutaj transakcje mają charakter imperatywny. Próba pisania tego zgodnie z FP jest kuriozalna. Oczywiście zapytania są deklaratywne, ale blokady czy logika sterująca między nimi już nie więc robienie z tego czegoś deklaratywnego totalnie mija się z celem.
Dopiero z czasem zobaczyłem pewną korzyść jaka idzie w parze z FP, ale jeśli trochę się odpuści i stosuje FP tam gdzie ma większy sens.
Tutaj chciałem podzielić się moimi uwagami, myślę, że spostrzeżenie jest o tyle ciekawe, że sam wcześniej nie przeczytałem niczego podobnego/zbliżonego. Wydaje mi się, że ta rzecz powinna być podkreślana już na samym początku nauki funkcyjnych języków.
W przypadku FP, warto podkreślić, że jest to paradygmat jaki sprzyja właściwie przetwarzaniu gruboziarnistemu. W innych paradygmatach też dane można przetwarzać gruboziarniście, ale różnica w FP polega na tym, że tutaj mamy więcej opcji do zredukowania złożoności końcowego rozwiązania.
Klasycznie, by ogarnąć złożoność, kontrolować ją, posiłkujemy się różnymi abstrakcjami. Za abstrakcję uznaje się ten kod, który nie jest kodem biznesowym i który pod wpływem zmian wymań biznesowych projektu nie ulega zmianie. Czyli to taki niezmienny kod, którego definicja jest niemal stała. Dobrym przykładem są funkcje takie jak sort, min, max, sum.
Sytuacja w przypadku FP wypada o tyle ciekawiej, że więcej rzeczy można wyabstrahować, a to dlatego, że tworzenie kolekcji z innej kolekcji jest znacznie tańsze. Wynika to z niemodyfikowalności danych, w tym kolekcji i optymalizacji związanej z persistent data structures. Dzięki temu można pisać bez większych problemów rozbudowane wyrażenia z zagnieżdżonymi kolekcjami, które w efekcie końcowym mogą doprowadzić do powstania jakiś rozdmuchanych dokumentów choćby pdf, xml, html :D (wygodnie i to bez korzystania z silnika szablonów, co jest dla mnie pewnym odkryciem).
Wg mnie tym co warto podkreślić to właściwie wszystkie pośrednie operacje na zagnieżdżonych kolekcjach jakie tutaj można wyabstrahować, i użyć podczas pisania kodu biznesowego. Taki krok z jednej strony niweluje konieczność pisania wielu pętli w kodzie biznesowym, a z drugiej prowadzi do powstania kodu jaki można ponownie użyć.
Składanie operacji, bez pisania pętli sprzyja pracy na styku gdzie są zebrane dane i potrzeba analiza. Czyli w takich językach jak M, R czy J (osobiście w żadnym nie programowałem, ale one od razu odsłaniają to czego na początku nie widziałem). Myślę, że tego typu języki powinny być pierwszym wyborem jeśli ktoś chce spróbować z funkcyjnym programowaniem.
Dobrym przykładem gdzie FP się bardzo dobrze spisuje są wszelkiego rodzaju aplikacje sieciowe, ponieważ większość z nich działa na zasadzie: request -> process -> response
Zgodziłbym się, gdyby to było bezstanowe, a tak to jest oderwane od rzeczywistości.Niby czemu?
Właściwie to ze względu na kompozycje, łatwiej i szybciej można składać operacje by uzyskać konkretny wynik. Szybciej tak mi się pracuje w REPL gdy coś robię z danymi.