La programación funcional es una bestia extraña para mí. Aprendí F # y Haskell, escribí algunos programas simples y me encanta usarlos, pero nunca tuve el "destello de revelación" del que algunas personas hablan. Pero lentamente, me di cuenta de que cada vez escribía más código que debía ser inmutable, dividiendo las tareas en más, funciones más pequeñas e intentando usar mucho más a los delegados. Es algo que, si te gusta, se desliza en tu trabajo porque el valor de esas técnicas es evidente.
Ahora, más prácticamente para el entrenamiento: encuentro que dos conceptos realmente hacen clic en Programación funcional como un estilo para mí.
Primero, el estilo FP se basa en la estructura de datos, no en la composición como en OOP. Miré algo como Lista en C # como un truco inteligente para generar listas seguras de tipo, algo que compuso el tipo (cadena) en el otro tipo (lista). Después de aprender FP, miro genéricos más como Monads ahora. La lista es una forma estructurada que puede tomar el código, y decora las cadenas.
En segundo lugar, y quizás más útil para los programadores de C # / ASP, es la idea de que FP funciona en la recursión y la repetición, mientras que OOP funciona en la mutabilidad y el bucle. Ahora tiendo a pensar en el ciclo de vida de la página ASP como una especie de FP: cada solicitud se procesa desde cero a lo largo de todo el ciclo de vida, por lo que toda la página es, en efecto, un gran programa que se repite lentamente. Si puede reducir esa noción, obtendrá una mejor idea de cómo se puede estructurar un programa imperativo alrededor de bucles de funciones que toman datos, operan sobre ellos y devuelven datos nuevos en lugar de modificar los antiguos.
El obstáculo más difícil, al menos para mí, para superar con este enfoque es esa sensación de hundimiento de que estás desperdiciando toneladas de recursos cuando usas objetos mutables ahorrarías una tonelada de memoria. En GC confiamos, y solo tuve que aprender a dejar de lado las preocupaciones de rendimiento hasta que realmente vi que el programa se ejecutaba y verificaba si había alguno, y de ser así, usar un generador de perfiles para ver exactamente dónde estaban los problemas.