Programowanie funkcjonalne jest dla mnie dziwną bestią. Nauczyłem się F # i Haskell, napisałem kilka prostych programów i uwielbiam ich używać, ale nigdy nie miałem „błysku objawienia”, o którym niektórzy mówią. Ale powoli zauważyłem, że coraz więcej piszę kod, który miał być niezmienny, dzieląc zadania na więcej, mniejsze funkcje i próbując używać delegatów o wiele więcej. Jeśli ci się spodoba, wkrada się do twojej pracy, ponieważ wartość tych technik jest oczywista.
Teraz, bardziej praktycznie, do treningu: uważam, że dwie koncepcje naprawdę mi się podobają do programowania funkcjonalnego.
Po pierwsze, styl FP oparty jest na strukturze danych, a nie na składzie jak w OOP. Patrzyłem na coś takiego jak List w C # jako sprytną sztuczkę do generowania list bezpiecznych dla typu, coś, co skomponowało typ (ciąg znaków) do innego typu (lista). Po nauczeniu się FP patrzę teraz na generyczne bardziej jak Monady. List to ustrukturyzowana forma, którą kod może przyjąć i ozdabia ciągi.
Po drugie, być może bardziej przydatny dla programistów C # / ASP, jest pomysł, że FP działa na rekurencję i powtarzanie, podczas gdy OOP działa na zmienność i zapętlanie. Myślę, że cykl życia strony ASP jest teraz rodzajem FP: każde żądanie jest przetwarzane od zera przez cały cykl życia, więc cała strona jest w efekcie jednym dużym, powolnym programem. Jeśli możesz zawęzić to pojęcie, uzyskasz lepsze pojęcie o tym, jak program imperatywny może być zbudowany wokół pętli funkcji, które pobierają dane, działają nad nim i zwracają nowe dane zamiast modyfikować stare.
Najtrudniejszą przeszkodą, przynajmniej dla mnie, do pokonania przy takim podejściu jest to, że tonące uczucie, że marnujesz mnóstwo zasobów podczas korzystania ze zmiennych obiektów, zaoszczędziłoby mnóstwo pamięci. W GC ufamy i po prostu musiałem nauczyć się rezygnować z problemów z wydajnością, dopóki nie zobaczyłem, że program działa i nie sprawdziłem, czy w ogóle istnieje, a jeśli tak, to użyj profilera, aby zobaczyć dokładnie, gdzie były problemy.