Poco a poco voy cambiando a F # para muchos de mis proyectos en el hogar, pero estoy un tanto perplejo en cuanto a cómo unir aplicaciones completas y, más particularmente, cuestiones transversales.F # registros/repositorios de la estructura de la aplicación, etc.
En C# si quiero registrar cosas, utilizaría la inyección de dependencia para pasar un ILogger a cada clase, y esto se puede llamar agradable y fácil desde el código. Puedo verificar en mis pruebas que, dada una situación particular, los registros se escriben, pasando un simulacro y verificándolo.
public class MyClass
{
readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public int Divide(int x, int y)
{
if(y == 0)
{
_logger.Warn("y was 0");
return 0;
}
return x/y;
}
}
En F # estoy usando módulos mucho más, lo que lo anterior se convertiría en
module Stuff
let divde x y =
match y with
| 0 -> 0
| _ -> x/y
Ahora si tuviera un módulo llamado registro tan sólo pudiera abrir eso y utilizar una función de registro de allí en el caso de que y sea 0, ¿pero cómo inyectaría esto para la prueba unitaria?
Podría hacer que cada función tomara una función de registro (cadena -> unidad) y luego utilizara una aplicación parcial para conectarlas, pero eso parece una gran cantidad de trabajo, como crear una nueva función que envuelva la llamada real dentro una llamada de registro. ¿Hay un patrón en particular o un poco de F # que me falta que pueda hacerlo? (He visto la función kprintf pero todavía no sé cómo se especificaría la función para varios escenarios de prueba, mientras se usa una implementación concreta para la aplicación completa)
Del mismo modo, ¿cómo cerraría un repositorio? que obtuvo datos? ¿Necesita tener una clase instanciada y establecer las funciones CRUD en él, o hay una forma de inyectar qué módulos se abren (aparte de #define)
http://stackoverflow.com/questions/2003487/architectural-thinking-in-functional-languages http://stackoverflow.com/questions/192090/how-do-you-design-a-functional-program –