我試圖創建一個具有較低級別的庫,它知道它需要保存和加載數據時,某些命令被稱爲一個解決方案,但對保存和加載功能的實現將與平臺提供具體項目引用下級庫。函數式編程和依賴倒置:如何抽象存儲?
我有一些車型,如:
type User = { UserID: UserID
Situations: SituationID list }
type Situation = { SituationID: SituationID }
而我想做的就是能夠定義和調用功能,如:
do saveUser()
let user = loadUser (UserID 57)
有什麼辦法來定義這個乾淨地使用功能語言,最好避免可變狀態(反正這不應該是必須的)?
一種方式做到這一點可能是這個樣子:
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)
而且有這個變化,但所有我能想到的那些涉及某種未初始化狀態的。 (在Xamarin中,還有DependencyService,但這本身就是我想避免的依賴項)。
有沒有什麼方法可以編寫調用尚未實現的存儲函數的代碼,然後實現它,沒有使用可變狀態?
(注:這個問題是不是存儲本身 - 這只是我使用的例如它是關於如何注入功能,而無需使用不必要的可變狀態。)