我在所有域名abject上使用字符串类型作为我的Id属性。 E.g:
public class Person {
property string Id { get; set; }
// ... more properties
}
这里没有招数。 null
表示“无价值”值,当创建新的人员并且在其保留之前,Id
将保持null
。
现在讨论增强“无价值”空间,并说null
,空字符串和空白字符串都是“无价值”。
即。检查实体是否是新的而不是:if (person.Id == null)
它将成为if (string.IsNullOrWhiteSpace(person.Id))
我认为这是一种嗅觉或设计原则违规,但我无法弄清楚哪一种。
问题:哪个(如果有的话)设计原则违反此决定(允许不仅仅null
代表无价值的决定)?
(我认为它应该类似于Occam的剃刀原则或熵或KISS,我只是不确定)
答案 0 :(得分:1)
我要指出并定义null
和""
,因为你的应用程序的空字符串不违反任何设计原则,也不是代码味道。您需要为您的目的清楚地定义字段的语义,并且您已经这样做了(即,在您的应用程序中,但null
和""
意味着“没有价值”)。
您应该拥有能够确保null
和""
行为正确的测试。
这并不是说您也无法决定强制所有空字符串为空。这是一个同样有效的决定。您需要进行测试以验证在设置“无值”的所有情况下,实际值为空。如果持久层需要null并且只有null来表示没有值,那么您可能希望采用这种方式。
所以,在这种情况下,没有错误的决定,只有决定。
答案 1 :(得分:1)
它确实违反了KISS原则。如果没有特别需要处理空字符串旁边的空字符串,那么为什么呢?所有操作现在必须检查两个值,而不是一个。在探索数据库时,一个简单的SELECT来查找“NULL”记录,在没有充分理由的情况下变得微不足道。
另一个违反原则的是最不惊讶的原则 - 通常人们只希望NULL值来表示NULL对象。具有两个特殊值的设计不太明显,而且“可读性”较低。
如果应该在这些“第二类特殊对象”背后隐藏更多内容,那么它应该是明确的。否则,处理空字符串输入应该是微不足道的,并将其存储为NULL以与系统的其余部分保持一致。
编辑:
我还在鲍勃·马丁的书Clean code中找到了另一个“原则” - “每个概念一个词”,它与这个案例有某种关系。空字符串和NULL是用于一个概念的两个“单词”,因此它们明显违反了该指南。