He estado usando f # y Haskell para aprender programación funcional desde hace un tiempo. Hasta que pueda obtener la aprobación de f # en nuestra compañía, aún debo usar C#. Todavía intento sin embargo mantenerme en el estilo funcional ya que he notado varios beneficios.De OO a programación funcional a 10,000 pies
Aquí hay un problema típico.
- hay una mesa-set clave en la base de datos con 3 llaves (6,5 millones de filas)
- Hay 4 otras mesas de apoyo de tamaño pequeño a mediano.
- Existen fórmulas complejas basadas en varias entradas.
Tengo que usar datos de todo lo anterior para calcular un valor y asociarlo con cada fila de juego de claves y enviarlo de regreso a la base de datos. Hay muchas búsquedas en las otras 4 tablas. Por el bien del rendimiento todo está hecho en la memoria.
Sé exactamente cómo lo haría en OO con diccionarios estáticos, modelos de objetos, patrones de estrategia y demás, pero de una manera funcional no puedo deshacerme del mal olor del uso de algunos de estos constructos.
Actualmente estoy haciendo las siguientes suposiciones para una solución funcional.
Los diccionarios estáticos son malos. Parece que la función podría tener efectos secundarios.
Necesito una función Calcular, toma un objeto inmutable (s) y devuelve un objeto inmutable con las tres claves y el valor calculado. Dentro de esta función podría haber otra función en el mismo estilo.
Los patrones OO tradicionales probablemente no funcionen.
¿Cómo diseñarías esto a un alto nivel?
¿Estoy equivocado? ¿Me he perdido algo?
Depende del idioma de OO en cuestión. C# hace un trabajo bastante bueno con técnicas funcionales. Y algunas cosas se pueden hacer de una manera bastante funcional en lenguajes OO más dolorosamente inflexibles como Java, pero ciertamente hay una buena cantidad de fricción cognitiva en ese caso. – JasonTrue
Si termina haciendo algo funcional y está en el entorno Java, probablemente sea mejor hacerlo en Clojure. Si bien técnicamente es un lenguaje Lisp y no basado en ML, puede funcionar con aplicaciones Java (genera bytecode JVM) y admite el desarrollo de un estilo funcional. –
C# falla en muchas técnicas funcionales.La inferencia de tipo extremadamente limitada es solo un obstáculo. Intente escribir el tipo de función que usa varios parámetros genéricos, como un diccionario de funciones. Ay. – MichaelGG