Funktionale Programmierung ist für mich ein merkwürdiges Biest. Ich habe F # und Haskell gelernt, habe ein paar einfache Programme geschrieben und liebe es, sie zu verwenden, aber ich hatte nie den "Blitz der Offenbarung", über den manche Leute sprechen. Aber langsam bemerkte ich, dass ich immer mehr Code schrieb, der unveränderlich sein sollte, Aufgaben in mehr, kleinere Funktionen aufteilte und versuchte, Delegierte viel mehr zu verwenden. Es ist eine Sache, die sich, wenn Sie es mögen, in Ihre Arbeit einschleicht, weil der Wert dieser Techniken offensichtlich ist.
Jetzt praktischer zum Training: Ich finde, dass zwei Konzepte für mich wirklich auf Functional Programming als Stil klicken.
Erstens basiert der FP-Stil auf der Datenstruktur und nicht auf der Komposition wie in OOP. Ich betrachtete etwas wie List in C # als einen cleveren Trick, um typsichere Listen zu generieren, etwas, das den Typ (String) in den anderen Typ (Liste) zusammensetzte. Nachdem ich FP gelernt habe, schaue ich mir Generika an, die jetzt eher Monaden ähneln. List ist eine strukturierte Form, die Code annehmen kann und die Zeichenfolgen schmückt.
Zweitens und möglicherweise nützlicher für C # / ASP-Programmierer ist die Idee, dass FP an Rekursion und Wiederholung arbeitet, während OOP an Veränderlichkeit und Schleifen arbeitet. Ich neige dazu, den ASP-Seitenlebenszyklus als eine Art FP zu betrachten: Jede Anforderung wird von Grund auf über den gesamten Lebenszyklus hinweg verarbeitet, sodass die gesamte Seite praktisch ein einziges großes, langsam wiederkehrendes Programm ist. Wenn Sie diesen Begriff eingrenzen können, erhalten Sie eine bessere Vorstellung davon, wie ein Imperativprogramm aus Schleifen von Funktionen aufgebaut sein kann, die Daten aufnehmen, darüber arbeiten und neue Daten zurückgeben, anstatt die alten zu ändern.
Die schwierigste Hürde, zumindest für mich, mit diesem Ansatz zu überwinden, ist das sinkende Gefühl, dass Sie Tonnen von Ressourcen verschwenden, wenn Sie veränderbare Objekte verwenden, was eine Menge Speicherplatz einsparen würde. Wir vertrauen auf GC, und ich musste erst lernen, Leistungsprobleme loszulassen, bevor ich das Programm tatsächlich laufen sah und verifizierte, ob es überhaupt welche gab, und wenn ja, einen Profiler zu verwenden, um genau zu sehen, wo die Probleme waren.