F#设定功能值

时间:2016-01-01 20:00:54

标签: f#

我在模块中有三个函数,SetBehaviour调用GetBehviour读取文本文件并将其反序列化回我的类型并将其返回到useCases。然后我通过'let behavior = useCases.Item(useCaseIdentifier)'

来获取我想要的对象

我的问题是有一种方法可以将'GlobalBehavior'设置为'SetBehaviour'的返回值,这样我可以直接调用'GlobalBehaviour'而无需每次都阅读文本文件和反序列化吗?

let GlobalBehaviour = //The return value of SetBehaviour here


let GetBehaviour =
    let useCases = Data.ReadUseCases
    let deserializedUseCases = JsonConvert.DeserializeObject<Map<string,Types.UseCase>>(useCases)
    deserializedUseCases


let SetBehaviour useCaseIdentifier =
    let useCases = GetBehaviour
    let behavior = useCases.Item(useCaseIdentifier)
    behavior

2 个答案:

答案 0 :(得分:4)

答案很大程度上取决于背景。例如,这是一些只发生一次的初始化,还是经常变化的东西?

通常,最好避免在F#中使用全局可变状态,而是记住模块中某个位置访问您在问题中显示的模块的最后行为。这样,客户端就可以控制状态(并且有各种方法可以实现更好的状态)。此外,如果您正在编写并发系统,则可能需要使用代理。

然而,使用变异的基本解决方案看起来像这样:

let mutable GlobalBehaviour = None // Initially the global behaviour is not set

let SetBehaviour useCaseIdentifier =
    let useCases = GetBehaviour
    let behavior = useCases.Item(useCaseIdentifier)
    GlobalBehaviour <- Some behaviour // Now we set it to the last one
    behaviour

在实践中,使用其他方法可能更有意义。例如,如果您只想运行一次,则可以使用lazy值(它会对函数进行一次计算并缓存结果,以便不重复读取您的配置)。但如果没有更多细节,很难给出更好的答案。

答案 1 :(得分:2)

您可以在模块初始化时缓存从文件读取的用例,如下所示:

module UseCaseModule
let GlobalBehaviour = //Retreive use case from cachedUseCases and useCaseId
let private cachedUseCases = JsonConvert.DeserializeObject<Map<string,Types.UseCase>>(Data.ReadUseCases)
let mutable private useCaseId = None
let private SetBehaviour useCaseIdentifier =
   useCaseId <- useCaseIdentifier
相关问题