您将打破DRY原则,将验证逻辑放在所有使用邮政编码的地方。
另一方面,在与许多不同的国家/地区和不同的邮政编码系统打交道时,这意味着除非您知道所涉及的国家/地区,否则您无法验证邮政编码。因此,您的ZipCode
班级也需要存储国家/地区。
但是,您是否随后分别将国家/地区存储为Address
邮政编码的一部分(邮政编码也是一部分)和邮政编码的一部分(用于验证)?
- 如果这样做,也违反了DRY。即使您不称其为DRY违规(因为每个实例有不同的用途),它仍然会不必要地占用额外的内存,并且在两个国家/地区的值不同时还可以打开错误的大门(从逻辑上讲,它们永远不应该这样做)是)。
- 或者,这可能导致您需要同步两个数据点以确保它们始终相同,这建议您无论如何都应将这些数据真正存储在单个点中,从而无法达到目的。
- 如果您不这样做,那么它不是一个
ZipCode
类,而是一个Address
类,该类又将包含一个string ZipCode
,这意味着我们已经全面发展。
例如,我可以与业务分析师讨论邮政编码,而不是包含邮政编码的字符串。
好处是您可以在描述域模型时谈论它们。
我不理解您的基本主张,即当一条信息具有给定的变量类型时,无论何时与业务分析师交谈,您都必须以某种方式提及该类型。
为什么?为什么您不能简单地谈论“邮政编码”并完全省略特定类型?您与业务分析师进行的是哪种讨论(不是技术性的!),而房屋的类型对于对话是最典型的?
我来自哪里,邮政编码始终是数字。因此,我们可以选择将其存储为int
或string
。我们倾向于使用字符串,因为对数据没有数学运算的期望,但是从未有业务分析师告诉我它必须是字符串。这个决定留给开发人员(或者可以说是技术分析师,尽管根据我的经验,他们并不直接处理棘手的问题)。
只要应用程序执行预期的操作,业务分析师就不会在意数据类型。
验证是一个棘手的难题,因为它取决于人类的期望。
一方面,我不同意验证论证作为显示为什么应避免原始痴迷的一种方式,因为我不同意(作为普遍真理)始终需要始终验证数据。
例如,如果这是一个更复杂的查找,该怎么办?如果您的验证需要联系外部API并等待响应,该怎么办而不是简单的格式检查?您是否真的要强制您的应用程序为ZipCode
实例化的每个对象调用此外部API ?
也许这是一个严格的业务要求,那么这当然是合理的。但这不是普遍真理。在很多用例中,这比解决方案要负担更多。
再举一个例子,以表格形式输入地址时,通常在您所在国家/地区之前输入邮政编码。虽然在UI中有即时验证反馈很不错,但是如果应用程序向我提示“错误的”邮政编码格式,这实际上会对我(作为用户)构成障碍,因为问题的真正根源是(例如)我的国家/地区不是默认选择的国家/地区,因此验证发生在错误的国家/地区。
这是错误的错误消息,它分散了用户的注意力并引起不必要的混乱。
就像永久验证不是普遍真理一样,我的示例也是如此。它是上下文相关的。某些应用程序域首先需要数据验证。其他域并没有将验证放在优先级列表上,因为它带来的麻烦与实际优先级冲突(例如,用户体验或最初存储错误数据的能力,因此可以对其进行纠正而不是永远不允许这样做)储存)
出生日期:检查是否大于预期且小于当前日期。
薪金:检查是否大于或等于零。
这些验证的问题在于它们不完整,多余或表明存在更大的问题。
检查日期是否大于提示。从字面上看,意味深长的日期是可能的最小日期。此外,您在哪里划界线?阻止DateTime.MinDate
但允许有DateTime.MinDate.AddSeconds(1)
什么意义?您正在挑选一个与许多其他值相比并没有特别错误的特定值。
我的生日是1978年1月2日(不是,但是假设是)。但是,假设您的应用程序中的数据有误,而是说我的生日是:
- 1978年1月1日
- 1722年1月1日
- 2355年1月1日
所有这些日期都是错误的。他们中没有一个比另一个更“正确”。但是,您的验证规则就只能抓一个的这三个例子。
您还完全省略了如何使用此数据的上下文。如果将其用于例如生日提醒机器人,我会说验证是没有意义的,因为填写错误的日期并没有特别严重的后果。
另一方面,如果这是政府数据,并且您需要出生日期来验证某人的身份(并且不这样做会导致不良后果,例如,拒绝某人的社会保障),那么数据的正确性至关重要,您需要完全验证数据。您现在所建议的验证是不够的。
对于薪水,存在一些常识,即它不能为负。但是,如果您实际上希望输入的是无意义的数据,则建议您调查这些无意义的数据的来源。因为如果不能信任他们输入敏感数据,那么您也就不能信任他们输入正确的数据。
如果相反,薪水是由您的应用程序计算的,并且以某种方式最终以负数(正确的数字)结尾,那么更好的方法是Math.Max(myValue, 0)
将负数转换为0,而不是使验证失败。因为如果您的逻辑确定结果为负数,那么验证失败将意味着必须重做计算,并且没有理由认为第二次将得出不同的数字。
而且,如果确实提供了不同的数字,那将再次导致您怀疑计算不一致,因此无法信任。
这并不是说验证没有用。但是,毫无意义的验证是不好的,既因为它花了很多力气却没有真正解决问题,还给了人们一种错误的安全感。