在项目中处理可插拔性的正确功能方法是什么?我正在使用 F# 开发一个新的开源项目,似乎无法摆脱插件和接口的面向对象的想法。我希望能够交换的东西是记录器、数据存储和身份验证。
我一直在寻找这个问题的答案,但除了这个之外还没有想出太多:http: //flyingfrogblog.blogspot.com/2010/12/extensibility-in-functional-programming.html
在项目中处理可插拔性的正确功能方法是什么?我正在使用 F# 开发一个新的开源项目,似乎无法摆脱插件和接口的面向对象的想法。我希望能够交换的东西是记录器、数据存储和身份验证。
我一直在寻找这个问题的答案,但除了这个之外还没有想出太多:http: //flyingfrogblog.blogspot.com/2010/12/extensibility-in-functional-programming.html
对于不同的功能语言,这个问题的答案会有所不同。F# 不是纯函数式的——它从函数式、命令式和面向对象的世界中汲取精华。
对于日志记录和身份验证之类的事情,最实用的方法是使用接口(在 F# 中,使用接口非常好,但人们通常不使用继承,而是更喜欢组合)。
当您可以调用多个不同的函数时,一个简单的界面是有意义的:
type IAuthentication =
abstract Authenticate : string * string -> bool
abstract ResetPassword : string * string -> void
您可以使用对象表达式,这是在 F# 中实现接口的一种非常好的方法。如果你只有一个函数(比如记录一条消息),那么你可以通过一个函数参数化你的代码(这就像一个只有一个方法的接口):
type Logger = string -> unit
对于身份验证和日志记录(在应用程序运行时可能不会更改),您可以使用全局可变值。尽管如果您想同步来自多个线程的请求并且存在一些可变状态,那么编写F# 代理可能是个好主意。