Sto passando gradualmente a F # per molti dei miei progetti a casa, ma sono un po 'perplesso su come collegare insieme applicazioni complete e, in particolare, preoccupazioni trasversali.Registrazione/repository della struttura dell'applicazione F #
In C# se voglio registrare roba, userei l'injection dependance per passare un ILogger in ogni classe, e quindi questo può essere chiamato bello e facilmente dal codice. Posso verificare nei miei test che, data una particolare situazione, i registri vengano scritti, passando una finta e verificandoli.
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;
}
}
In F # Sto utilizzando i moduli molto di più, in modo che il sopra diventerebbe
module Stuff
let divde x y =
match y with
| 0 -> 0
| _ -> x/y
Ora, se ho avuto un modulo chiamato registrazione ho potuto solo aprire questo e utilizzare una funzione di log da lì nel caso in cui y sia 0, ma come dovrei iniettarlo per il test dell'unità?
Potrei avere ciascuna funzione prendere una funzione di registro (stringa -> unità) e quindi utilizzare un'applicazione parziale per collegarli, ma sembra un sacco di lavoro, come se creerebbe una nuova funzione che avvolge la chiamata effettiva all'interno una chiamata di registrazione. C'è uno schema particolare o un po 'di F # che mi manca che può farlo? (Ho visto la funzione kprintf ma ancora non so come specificare la funzione per vari scenari di test, mentre utilizzo un'implementazione concreta per l'applicazione completa)
Analogamente, come si esegue lo stub di un repository quei dati recuperati? Avete bisogno di avere qualche classe istanziata e impostare le funzioni CRUD su di esso, o c'è un modo per iniettare i moduli che si aprono (a parte #define)
http://stackoverflow.com/questions/2003487/architectural-thinking-in-functional-languages http://stackoverflow.com/questions/192090/how-do-you-design-a-functional-program –