我在F#中重写一个C#库,其中大多数类与数据库表一对一映射(类似于ActiveRecord).我正在考虑是否使用记录或类(甚至可能是DU?).在属性设置器中有相当多的验证来维护不变量. 在F#中对此进行建模的最佳方法是什么? 我不希望将违反业务逻辑的对象持久化到数据库.欢迎任何想法.
还有一些想法......将不变量移动到外部"控制器"类是否更好?来自C#,允许与数据库记录对应的对象包含无法保存到数据库的任何内容,这是错误的.我想因为早先失败似乎比以后失败更好.
这实际上应该是您处理它的好方法。在构造函数中包含验证逻辑将使您稍后在代码中放心,因为该对象是不可变的。这也开启了多线程的可能性。
不可变版本
type Customer (id, name) =
do // Constructor
if id <= 0 then
raise(new ArgumentException("Invalid ID.", "id"))
elif String.IsNullOrEmpty(name) then
raise(new ArgumentException("Invalid Name.", "name"))
member this.ID
with get() = id
member this.Name
with get() = name
member this.ModifyName value =
new Customer(id, value)
Run Code Online (Sandbox Code Playgroud)
可变版本
type Customer (id) =
let mutable name = ""
do // Constructor
if id <= 0 then
raise(new ArgumentException("Invalid ID.", "id"))
member this.ID
with get() = id
member this.Name
with get() = name
and set value =
if String.IsNullOrEmpty(name) then
raise(new ArgumentException("Invalid Name.", "value"))
name <- value
Run Code Online (Sandbox Code Playgroud)