我正在查看基本上传递id的代码,例如:
GetPersonById(int personId)
但它没有使用int,而是使用了PersonId对象。
GetPersonById(PersonId personId)
PersonId对象只是一个带有一些手摇代码的int,使其可以为空。当可嵌入的int不可用时,或者在类中包装简单类型有更高的目的时,这是在旧的.NET中创建的吗?
public sealed class PersonId {
private PersonId() {
_isNull = true;
_value = 0;
}
private PersonId(int value) {
_isNull = false;
_value = value;
}
// and so on!
}
答案 0 :(得分:16)
在这样的DDD代码中,用于使此ID引用的类型更明确。
特别是在精心设计的聚合环境中,对其他聚合的引用通常是通过ID而不是通过对象引用。在这种情况下,可以使用这些ID值对象来避免意外混合这些ID,并且 - 如前所述 - 使其更明确地引用聚合。
答案 1 :(得分:8)
如果用于识别人员的字段需要更改,则使用类是简化进一步重构的好方法。假设明天系统到达Int32.MaxValue
个人,并且您希望使用Int64
或字符串来识别它们。另一种情况是,当系统的要求不是100%准确时,他们没有指定是否可以通过ID,PIN或您可以想到的任何字段组合来识别某个人。这段代码的作者可能会通过创建这个类来阻止重大的重构。
答案 2 :(得分:5)
答案也可能是语义!
想象一下,你有一些int
值。它是ID
吗?或者是年龄,身高(cm),温度(摄氏度),电视节目数量?好吧,你可以给变量一个好名字,但如果你犯了错误,这不会保护你。
相反,如果一个函数需要一个ID类实例(好吧,伪装成int
而不仅仅是int
,但是你试图错误地传递X坐标值(恰好是int
,或者Coordinate
的实例,或者其他什么),编译器会捕获它并警告你。除此之外,任何阅读代码的人都可以清楚地看到所需的值不是只是 int,而是一个ID - 你不能用文档做得更好,无论如何都没有人读它。
(旁注:你无法想象,我曾经尝试重构使用double
代码的角度和角度有多大的头痛!这是一场噩梦!切换到{{1}后一切都好多了。)
答案 3 :(得分:2)
当Nullable<T>
不存在时,此代码可能是用C#1.0编写的。
现在你应该使用int?
。
答案 4 :(得分:1)
对我来说,我认为最好使用最原始的框架类型。
- &GT;没有好处
答案 5 :(得分:1)
旧的C#可以解释它
但我猜它可以有其他解释,未来的想法......
如果将来你希望为一个人拥有更多数据,通过更改PersonId类本身或继承它,所有代码仍然可以正常工作。但如果您使用int?
,则必须更改所有电话。
答案 6 :(得分:0)
除了使用值类型为可空之外,没有任何好处。没什么。