允许超过一个"无价值"价值空间的价值

时间:2012-07-25 13:47:16

标签: oop design-patterns design-principles

我在所有域名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,我只是不确定)

2 个答案:

答案 0 :(得分:1)

我要指出并定义null"",因为你的应用程序的空字符串不违反任何设计原则,也不是代码味道。您需要为您的目的清楚地定义字段的语义,并且您已经这样做了(即,在您的应用程序中,但null""意味着“没有价值”)。

您应该拥有能够确保null""行为正确的测试。

这并不是说您也无法决定强制所有空字符串为空。这是一个同样有效的决定。您需要进行测试以验证在设置“无值”的所有情况下,实际值为空。如果持久层需要null并且只有null来表示没有值,那么您可能希望采用这种方式。

所以,在这种情况下,没有错误的决定,只有决定。

答案 1 :(得分:1)

它确实违反了KISS原则。如果没有特别需要处理空字符串旁边的空字符串,那么为什么呢?所有操作现在必须检查两个值,而不是一个。在探索数据库时,一个简单的SELECT来查找“NULL”记录,在没有充分理由的情况下变得微不足道。

另一个违反原则的是最不惊讶的原则 - 通常人们只希望NULL值来表示NULL对象。具有两个特殊值的设计不太明显,而且“可读性”较低。

如果应该在这些“第二类特殊对象”背后隐藏更多内容,那么它应该是明确的。否则,处理空字符串输入应该是微不足道的,并将其存储为NULL以与系统的其余部分保持一致。

编辑:

我还在鲍勃·马丁的书Clean code中找到了另一个“原则” - “每个概念一个词”,它与这个案例有某种关系。空字符串和NULL是用于一个概念的两个“单词”,因此它们明显违反了该指南。