18

我正在查看本质上传递 id 的代码,例如:

GetPersonById(int personId)

但它没有使用 int,而是使用了 PersonId 对象。

GetPersonById(PersonId personId)

PersonId 对象只是一个带有一些手摇代码的 int,以使其可以为空。那么,当可空整数不可用时,这是在旧的 .NET 中创建的,还是有更高的目的将简单类型包装在类中?

public sealed class PersonId {

    private PersonId() {
        _isNull = true;
        _value = 0;
    }


    private PersonId(int value) {
        _isNull = false;
        _value = value;
    }

    // and so on!
}
4

7 回答 7

16

在这样的DDD代码中,用于使该 ID 引用的类型更加明确。

尤其是在设计良好的聚合的上下文中,对其他聚合的引用通常是通过 ID 而不是对象引用。在这种情况下,可以使用这些 ID 值对象来避免这些 ID 的意外混合,并且 - 如前所述 - 使引用的聚合更加明确。

于 2012-09-03T15:11:32.800 回答
8

如果用于识别人员的字段需要更改,使用类是简化进一步重构的好方法。假设明天系统会联系到Int32.MaxValue人们,而您想使用一个Int64或一个字符串来识别他们。另一种情况是,当系统的要求不是 100% 准确时,他们没有指定是否可以通过 ID、PIN 或您能想到的任何字段组合来识别一个人。这段代码的作者可能已经通过创建这个类来防止重大重构。

于 2012-09-03T15:15:58.367 回答
5

答案也可能是语义!

想象一下,你有一些int价值。是ID吗?或者是年龄、身高cm、温度摄氏度、电视节目数量?好吧,你可以给变量起个好名字,但是如果你犯了错误,这并不能保护你。

相反,如果一个函数需要一个 ID 类实例(这是伪装的)而int不仅仅是无论如何),编译器捕捉到它并警告你。除此之外,任何阅读代码的人都可以清楚地看到所需的值不仅仅是int,而是一个 ID——你不能用文档做得更好,反正没人读。intintCoordinate

(旁注:你无法想象,我在尝试重构用于double角度和弧度的代码时有多头疼!这是一场噩梦!切换到 a 后class Angle,一切都变得更好了。)

于 2012-09-03T19:45:57.610 回答
2

Nullable<T>这段代码可能是在不存在时用 C# 1.0 编写的。

现在你应该int?改用。

于 2012-09-03T15:10:09.440 回答
1

对我来说,我认为最好使用框架中最原始的类型。

-> 没有好处

于 2012-09-03T15:11:27.660 回答
1

旧的 C# 可以是它的一种解释。
但我想它可以有其他解释,未来的想法......
如果将来你想为一个人提供更多数据,通过更改 PersonId 类本身或继承它,所有代码仍然可以正常工作是。但如果你会使用int?那么你将不得不改变所有的电话。

于 2012-09-03T15:13:04.123 回答
0

除了将值类型用作可空值之外,没有任何好处。而已。

于 2012-09-03T15:10:35.447 回答