oop - 允许值空间中存在多个 "no-value"值

标签 oop design-patterns design-principles

我在所有域对象上使用字符串类型作为 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/

相关文章:

java - 迭代私有(private)数据成员

c++ - 如何在其父类中调用子类?

javascript - 从javascript中的构造函数创建编号对象

java - 我想覆盖子类中的 Private 内部类方法是否有可能或任何其他方式来做到这一点?

java - 控制反转与好莱坞原则的混淆

ruby-on-rails - 设计模式和设计原则有什么区别?

c# - 使用 SQLite 时实现 MVVM 设计模式的正确方法

design-patterns - 在 MVVM 中, View 应该知道模型吗?

java - 使用魔数(Magic Number) (1) 或全局常量检查列表大小?

oop - 具体实现是否应该提供其实现的接口(interface)中不存在的任何公共(public) API?