【发布时间】:2015-09-05 09:47:15
【问题描述】:
我正在尝试创建一个具有较低级别库的解决方案,该库将知道在调用某些命令时它需要保存和加载数据,但保存和加载功能的实现将在平台中提供- 引用低级库的特定项目。
我有一些模型,例如:
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,但这本身就是我想避免的依赖项。)
有没有什么方法可以编写调用尚未实现的存储函数的代码,然后在不使用可变状态的情况下实现它?
(注意:这个问题与存储本身无关——这只是我正在使用的示例。它是关于如何在不使用不必要的可变状态的情况下注入函数。)
【问题讨论】:
标签: xamarin f# functional-programming storage abstraction