强类型实体标识符

时间:2010-03-01 12:50:56

标签: c#

使用面向服务的应用程序时,我们经常使用系统类型来识别/查询我们的业务实体。

IList<Product> GetProductsByUserAndCategoryId(int userId, int categoryId);

但是我们不能阻止开发人员传递另一个不是“用户标识符”而不是“类别标识符”的标识符,或者可能反转方法调用上的ID。

因此,解决方案是使用强类型标识符,如下所示:

IList<Product> GetProductsByUserAndCategoryId(UserId userId, CategoryId categoryId);

GetProductsByUserAndCategoryId(new UserId(123), new CategoryId(456));

您如何看待这个?优点和缺点?

2 个答案:

答案 0 :(得分:3)

  

优点和缺点?

嗯,首先,这只会改变验证的时刻;它仍然必须发生,最好只要UserId(...)被实例化。你还必须看看这对你的系统是否真的有任何好处。

另一方面,我认为它通过消除固有模糊数字之间的歧义来防止错误。让同一类型int代表两个完全不相关的东西 实际上是危险的。

在最近的一次代码审查中(对于大学的课程),没有。学生犯的1个错误是以错误的方式使用整数。在你的例子中使用了不同的类型,实际上可以完全防止这种错误来源。

所以,总而言之,我认为没有一个空白的答案,但我一般都赞成这样的习语。这是严格类型系统的真正好处之一。

答案 1 :(得分:1)

对我来说唯一真正的骗局是必须输入额外的代码。你的代码变得更加严格定义,这是一件好事,但现在实际上要编写代码会有额外的摩擦。这只需要花费额外的时间和精力来节省维护和后来的可靠性。

任何方法都是一样的。 TDD人员花时间在前面构建脚手架和测试,希望它能使代码更可靠,更容易维护。 - 他们中的许多人说这也节省了时间......但我有疑虑:) -

最终我同意鲁道夫先生的意见。这是严格类型系统的优势;使用它对您有利。