Sto cercando di creare una soluzione che abbia una libreria di livello inferiore che sappia che è necessario salvare e caricare i dati quando vengono chiamati determinati comandi, ma l'implementazione delle funzioni di salvataggio e caricamento verrà fornita in una piattaforma- progetto specifico che fa riferimento alla libreria di livello inferiore.Programmazione funzionale e inversione di dipendenza: come astrarre lo spazio di archiviazione?
Ho alcuni modelli, come ad esempio:
type User = { UserID: UserID
Situations: SituationID list }
type Situation = { SituationID: SituationID }
E quello che voglio fare è essere in grado di definire e funzioni come la chiamata:
do saveUser()
let user = loadUser (UserID 57)
Esiste un modo per definire questa pulito nell'idioma funzionale, preferibilmente evitando lo stato mutabile (che non dovrebbe essere comunque necessario)?
Un modo per farlo potrebbe essere simile a questo:
type IStorage = {
saveUser: User->unit;
loadUser: UserID->User }
module Storage =
// initialize save/load functions to "not yet implemented"
let mutable storage = {
saveUser = failwith "nyi";
loadUser = failwith "nyi" }
// ....elsewhere:
do Storage.storage = { a real implementation of IStorage }
do Storage.storage.saveUser()
let user = Storage.storage.loadUser (UserID 57)
E ci sono variazioni su questo, ma tutti quelli che mi vengono in mente comporta un qualche tipo di stato non inizializzato. (In Xamarin, esiste anche DependencyService, ma è anch'esso una dipendenza che vorrei evitare.)
C'è un modo per scrivere codice che chiama una funzione di archiviazione, che non è stata ancora implementata, e quindi implementare esso, SENZA usare lo stato mutabile?
(Nota: questa domanda non si tratta di stoccaggio in quanto tale - questo è solo l'esempio che sto usando Si tratta di come iniettare funzioni senza l'utilizzo di stato mutevole inutili..)