Ich versuche, eine Lösung zu erstellen, die eine untergeordnete Bibliothek hat, die weiß, dass sie Daten speichern und laden muss, wenn bestimmte Befehle aufgerufen werden. Die Implementierung der Speicher- und Ladefunktionen wird jedoch in einer Plattform zur Verfügung gestellt. spezifisches Projekt, das auf die untergeordnete Bibliothek verweist.Funktionale Programmierung und Abhängigkeitsinversion: Wie kann man den Speicher abstrahieren?
Ich habe einige Modelle, wie zum Beispiel:
type User = { UserID: UserID
Situations: SituationID list }
type Situation = { SituationID: SituationID }
Und was will ich in der Lage zu tun sein, um Funktionen zu definieren und rufen wie:
do saveUser()
let user = loadUser (UserID 57)
Gibt es eine Möglichkeit, dies zu definieren sauber in der funktionalen Sprache, möglichst unter Vermeidung eines veränderlichen Zustands (der sowieso nicht notwendig sein sollte)?
Eine Möglichkeit, es zu tun, so etwas wie dies aussehen könnte:
auf diesemtype 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)
Und es gibt Variationen, aber alle diejenigen, die ich von beinhalten eine Art von nicht initialisierten Zustand denken kann. (In Xamarin gibt es auch DependencyService, aber das ist selbst eine Abhängigkeit, die ich gerne vermeiden würde.)
Gibt es eine Möglichkeit, Code zu schreiben, der eine Speicherfunktion aufruft, die noch nicht implementiert wurde, und dann implementieren es, OHNE einen veränderlichen Zustand zu verwenden?
(Hinweis: Diese Frage ist nicht über Lagerung selbst - das ist nur das Beispiel ich benutze Es geht darum, wie Funktionen zu injizieren, ohne unnötigen wandelbaren Zustand zu verwenden..)