我在所有域对象上使用字符串类型作为 Id 属性。例如:
public class Person {
property string Id { get; set; }
// ... more properties
}
这里没有技巧。 null
表示一个“无值”值,当创建一个新的 Person 并在其被持久化之前,Id
将保持null
.
现在有讨论增强“无值(value)”空间并说null
、空字符串和空白字符串都是“无值”值。
即检查实体是否是新的而不是执行: if (person.Id == null)
它将变成if (string.IsNullOrWhiteSpace(person.Id))
以我的拙见,这是一种气味或违反设计原则,但我不知道是哪一个。
问题:此决定违反了哪一条(如果有)设计原则(允许超过 null
代表无值(value)值的决定)?
(我认为它应该类似于奥卡姆 Razor 原理或熵或KISS,我只是不确定)
最佳答案
这确实违反了 KISS 原则。如果除了空值之外没有特殊需要处理空字符串,那么为什么要这样做呢?所有操作现在必须检查两个值,而不是一个。在探索数据库时,查找“NULL”记录的简单 SELECT 会毫无理由地变得稍微不那么简单。
另一个违反的原则是最小意外原则——通常人们期望只有 NULL 值来表示 NULL 对象。具有两个特殊值的设计不太明显,并且不太“可读”。
如果这些“第二类特殊对象”背后还应该隐藏更多东西,那么就应该将其明确化。否则,处理空字符串输入并将其存储为 NULL 以与系统的其余部分保持一致应该很简单。
编辑:
我还在鲍勃·马丁的书中发现了另一个“原理”Clean code - “每个概念一个词”,这在某种程度上与本案有关。空字符串和 NULL 是用于同一个概念的两个“单词”,因此它们显然违反了这一准则。
关于oop - 允许值空间中存在多个 "no-value"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11651207/