想象一下,您有一个将整数转换为罗马字符串的函数:
public String roman(int)
只有 1 到 3999(含)之间的数字可以转换。
那么如果有人在任何 OO 语言中通过 4000,你会怎么做?
- 引发异常
- 返回“”或其他一些特殊字符串
- 写一个断言
- …</li>
想象一下,您有一个将整数转换为罗马字符串的函数:
public String roman(int)
只有 1 到 3999(含)之间的数字可以转换。
那么如果有人在任何 OO 语言中通过 4000,你会怎么做?
第 1 点:引发异常。这就是ArgumentOutOfRangeException
(至少在.NET中)的目的:
if (intToConvert >= 4000)
{
throw new ArgumentOutOfRangeException("intToConvert ", "Only numbers 1-3000 are valid for conversion.");
}
总的来说,我发现验证主题非常有趣。在我看来,选项 2(返回一个特殊值)不是一个好选项,因为您强制客户端执行 if/case 来检查返回的值,并且必须在任何地方重复该代码。此外,与通过调用堆栈传播的异常不同,在这种情况下,调用者几乎总是必须处理该特殊值的那个。
在 OOP 引发异常或有断言的情况下,IMO 是一种更优雅的处理方式。但是我发现由于某些原因,每种方法中的内联验证码都不能很好地扩展:
几年前,我参加了一个关于验证器的演讲(类似的演讲幻灯片在这里。解释它的文档曾经在http://www.caesarsystems.com/resources/caesarsystems/files/Extreme_Validation.pdf但现在它是 404 :() 并且完全喜欢这个概念。恕我直言,拥有一个采用 OO 哲学的验证框架是可行的方法。如果您想阅读它,我已经在这里和这里写了几篇关于它的帖子(免责声明:帖子是我工作的公司博客的一部分)。
高温高压