Model.Is ___ - 它应该是属性还是方法?

Dav*_*vid 2 c# domain-model

当我为域设计模型时,它们几乎总是.IsSomething在它们上面有一些功能. IsNew并且IsDirty对于数据持久性目的而言是常见的,IsValid对于业务规则验证,甚至IsFraudulent在当前项目中(更多业务规则验证)等.每当我看到其他人实现这些时,它们几乎总是作为方法完成.但我发现自己想知道是否有特殊原因.

我倾向于将属性描述为描述对象和方法以执行某种操作.这些并不是真正的行动.它们涉及代码,因为它们在被调用时是动态确定的,并且它们显然是只读的,但对我来说它们仍然适合作为属性而不是方法.

我想,可能存在属性的序列化问题.虽然丰富的域模型往往不能很好地序列化,因为它包含逻辑和功能,所以每当我需要在服务边界上移动某些东西时,我通常首先将它扁平化为定义的DTO结构.

但我想知道其他人是否对这个问题有任何见解?是否有充分的理由将这些实现为方法而不是属性?

(切向相关,虽然已经给出了答案,但扩展属性确实有助于在这样的事情上保持一致.我有许多IsSomething()扩展方法,通常System.String用于实现特定于域的逻辑.但即使属性是通过go,我可能想坚持使用方法只是为了与扩展保持一致.)

Jon*_*eet 6

假设访问该属性:

  • 没有副作用
  • 是"合理快速"(是的,非常羊毛......)

然后我认为没有理由不把它变成财产.序列化不应该是一个问题 - 大多数序列化方案提供了将属性标记为瞬态(即不被序列化)的方法.