我试图创建一个具有较低级别的库,它知道它需要保存和加载数据时,某些命令被称为一个解决方案,但对保存和加载功能的实现将与平台提供具体项目引用下级库。函数式编程和依赖倒置:如何抽象存储?
我有一些车型,如:
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,但这本身就是我想避免的依赖项)。
有没有什么方法可以编写调用尚未实现的存储函数的代码,然后实现它,没有使用可变状态?
(注:这个问题是不是存储本身 - 这只是我使用的例如它是关于如何注入功能,而无需使用不必要的可变状态。)