2

我在我的所有域中使用字符串类型作为我的 Id 属性。例如:

public class Person {
    property string Id { get; set; }
    // ... more properties
}

这里没有技巧。null代表一个“无价值”的值,当一个新的 Person 被创建并且在它被持久化之前,Id将保持null

现在有一个讨论来增强“无值”空间并说null,空字符串和空白字符串都是“无值”值。

即检查实体是否是新的而不是做:if (person.Id == null)它将成为if (string.IsNullOrWhiteSpace(person.Id))

在我看来,这是一种气味或违反设计原则的行为,但我不知道是哪一种。

问题:这个决定违反了哪个(如果有的话)设计原则(决定允许不仅仅是null代表无价值的价值)?

(我认为它应该类似于奥卡姆剃刀原理或熵或 KISS,我只是不确定)

4

2 回答 2

1

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

您应该进行测试以确保 和 的行为都是正确null""

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

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

于 2012-07-25T13:54:26.650 回答
1

它确实违反了 KISS 原则。如果除了 null 之外没有特殊需要处理空字符串,那为什么要这样做呢?所有操作现在必须检查两个值,而不是一个。在探索 DB 时,一个简单的 SELECT 来查找“NULL”记录变得不那么琐碎了,没有充分的理由。

另一个违反的原则是最小意外原则——通常人们只期望 NULL 值来表示 NULL 对象。带有两个特殊值的设计不太明显,也不太“可读”。

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

编辑:

我还在 Bob Martin 的书清洁代码中找到了另一个“原则” ——“每个概念一个词”,这与这个案例有某种关系。空字符串和 NULL 是用于一个概念的两个“词”,因此它们显然违反了本指南。

于 2013-08-08T00:24:59.763 回答